iOS 边学边记 HLS协议 m3u8 ts详解

1.HLS综述

HLS 就不得不谈苹果,谈苹果就不得不提乔帮主。HLS就是“HTTP Live Streaming”的缩写,它诞生自2009年,QuickTimeiPhone3GS黄金搭档下的一个标准,一个意在颠覆流媒体产业的新协议。

它的工作原理简单来说就是把一段视频流,分成一个个小的基于HTTP的文件来下载。当媒体流正在播放时,客户端可以根据当前网络环境,方便地在不同的码率流中做切换,以实现更好的观影体验。

HLS的出现是为了解决苹果原生环境中的流媒体播放,这个协议可以方便地让MaciPhone播放视频流,不依赖Adobe,更不用去管什么标准委员会。依赖自己,永远是最大力量的保障。

HLS(HTTP Live Streaming) 把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。HLS 协议由三部分组成:HTTPM3U8TS。这三部分中,HTTP 是传输协议,M3U8 是索引文件,TS 是音视频的媒体信息。

HLS 提供一个 m3u8 地址,AppleSafari 浏览器直接就能打开 m3u8 地址,譬如:

http://demo.srs.com/live/livestream.m3u8

Android 不能直接打开,需要使用 html5video 标签,然后在浏览器中打开这个页面即可,譬如:

<!-- livestream.html -->
<video width="640" height="360"
        autoplay controls autobuffer 
        src="http://demo.srs.com/live/livestream.m3u8"
        type="application/vnd.apple.mpegurl">
</video>

HLSm3u8,是一个 TS 的列表,也就是告诉浏览器可以播放这些 TS 文件,譬如:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:64
#EXT-X-TARGETDURATION:12
#EXTINF:11.550
livestream-64.TS
#EXTINF:5.250
livestream-65.TS
#EXTINF:7.700
livestream-66.TS
#EXTINF:6.850
livestream-67.TS

有几个关键的参数,这些参数在 SRS 的配置文件中都有配置项:

  • EXT-X-TARGETDURATION:所有切片的最大时长。有些 Apple 设备这个参数不正确会无法播放。SRS 会自动计算出 TS 文件的最大时长,然后更新 m3u8 时会自动更新这个值。用户不必自己配置。
  • EXTINFTS 切片的实际时长,SRS 提供配置项 hls_fragment,但实际上的 TS 时长还受 gop 影响。
  • TS 文件的数目:SRS 可配置 hls_window,指定 m3u8 中保存多少个切片,SRS 会自动清理旧的切片
  • livestream-67.TSSRS 会自动维护 TS 切片的文件名,在编码器重推之后,这个编号会继续增长,保证流的连续性。直到 SRS 重启,这个编号才重置为 0

譬如,每个 TS 切片为 10 秒,窗口为 60 秒,那么 m3u8 中会保存 6TS 切片。

每一个 .m3u8 文件,分别对应若干个 TS 文件,这些 TS 文件才是真正存放视频的数据,m3u8 文件只是存放了一些 TS 文件的配置信息和相关路径,当视频播放时,.m3u8 是动态改变的,video 标签会解析这个文件,并找到对应的 TS 文件来播放,所以一般为了加快速度,.m3u8 放在 web 服务器上,TS 文件放在 CDN 上。

.m3u8 文件,其实就是以 utf-8 编码的 m3u 文件,这个文件本身不能播放,只是存放了播放信息的文本文件。

HLS 整体框架图:Server、CDN 和 Client
iOS 边学边记 HLS协议 m3u8 ts详解_第1张图片
HLS 协议编码格式要求

  • 视频的编码格式:H264
  • 音频的编码格式:AACMP3AC-3
  • 视频的封装格式:TS
  • 保存 TS 索引的 m3u8 文件

HLS 协议优势

  • HLS 相对于 RTMP 来讲使用了标准的 HTTP 协议来传输数据,可以避免在一些特殊的网络环境下被屏蔽。
  • HLS 相比 RTMP 在服务器端做负载均衡要简单得多。因为 HLS 是基于无状态协议 HTTP 实现的,客户端只需要按照顺序使用下载存储在服务器的普通 TS 文件进行播放就可以。而 RTMP 是一种有状态协议,很难对视频服务器进行平滑扩展,因为需要为每一个播放视频流的客户端维护状态。
  • HLS 协议

你可能感兴趣的:(iOS,边学边记,ios,objective-c,xcode)