1.HLS综述
谈HLS
就不得不谈苹果,谈苹果就不得不提乔帮主。HLS
就是“HTTP Live Streaming
”的缩写,它诞生自2009
年,QuickTime
和iPhone3GS
黄金搭档下的一个标准,一个意在颠覆流媒体产业的新协议。
它的工作原理简单来说就是把一段视频流,分成一个个小的基于HTTP
的文件来下载。当媒体流正在播放时,客户端可以根据当前网络环境,方便地在不同的码率流中做切换,以实现更好的观影体验。
HLS
的出现是为了解决苹果原生环境中的流媒体播放,这个协议可以方便地让Mac
和iPhone
播放视频流,不依赖Adobe
,更不用去管什么标准委员会。依赖自己,永远是最大力量的保障。
HLS(HTTP Live Streaming)
把整个流分成一个个小的基于 HTTP
的文件来下载,每次只下载一些。HLS
协议由三部分组成:HTTP
、M3U8
、TS
。这三部分中,HTTP
是传输协议,M3U8
是索引文件,TS
是音视频的媒体信息。
HLS
提供一个 m3u8
地址,Apple
的 Safari
浏览器直接就能打开 m3u8
地址,譬如:
http://demo.srs.com/live/livestream.m3u8
Android
不能直接打开,需要使用 html5
的 video
标签,然后在浏览器中打开这个页面即可,譬如:
<!-- livestream.html -->
<video width="640" height="360"
autoplay controls autobuffer
src="http://demo.srs.com/live/livestream.m3u8"
type="application/vnd.apple.mpegurl">
</video>
HLS
的 m3u8
,是一个 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
时会自动更新这个值。用户不必自己配置。EXTINF
:TS
切片的实际时长,SRS
提供配置项hls_fragment
,但实际上的TS
时长还受gop
影响。TS
文件的数目:SRS
可配置hls_window
,指定m3u8
中保存多少个切片,SRS
会自动清理旧的切片livestream-67.TS
:SRS
会自动维护TS
切片的文件名,在编码器重推之后,这个编号会继续增长,保证流的连续性。直到SRS
重启,这个编号才重置为0
。
譬如,每个 TS
切片为 10
秒,窗口为 60
秒,那么 m3u8
中会保存 6
个 TS
切片。
每一个 .m3u8
文件,分别对应若干个 TS
文件,这些 TS
文件才是真正存放视频的数据,m3u8
文件只是存放了一些 TS
文件的配置信息和相关路径,当视频播放时,.m3u8
是动态改变的,video
标签会解析这个文件,并找到对应的 TS
文件来播放,所以一般为了加快速度,.m3u8
放在 web
服务器上,TS
文件放在 CDN
上。
.m3u8
文件,其实就是以 utf-8
编码的 m3u
文件,这个文件本身不能播放,只是存放了播放信息的文本文件。
HLS 整体框架图:Server、CDN 和 Client
HLS 协议编码格式要求
- 视频的编码格式:
H264
- 音频的编码格式:
AAC
、MP3
、AC-3
- 视频的封装格式:
TS
- 保存
TS
索引的m3u8
文件
HLS 协议优势
HLS
相对于RTMP
来讲使用了标准的HTTP
协议来传输数据,可以避免在一些特殊的网络环境下被屏蔽。HLS
相比RTMP
在服务器端做负载均衡要简单得多。因为HLS
是基于无状态协议HTTP
实现的,客户端只需要按照顺序使用下载存储在服务器的普通 TS 文件进行播放就可以。而RTMP