转自:
HLS(HTTP Live Streaming)的分析:
HTTP Live Streaming(HLS)是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播,主要应用在iOS系统,为iOS设备(如iPhone、iPad)提供音视频直播和点播方案。HLS点播,基本上就是常见的分段HTTP点播,不同在于,它的分段非常小。要实现HLS点播,重点在于对媒体文件分段,目前有不少开源工具可以使用,这里我就不再讨论,只谈HLS直播技术。
相对于常见的流媒体直播协议,例如RTMP协议、RTSP协议、MMS协议等,HLS直播最大的不同在于,直播客户端获取到的,并不是一个完整的数据流。HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。由此可见,基本上可以认为,HLS是以点播的技术方式来实现直播。由于数据通过HTTP协议传输,所以完全不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过HLS的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议。
要实现HTTP Live Streaming直播,需要研究并实现以下技术关键点:
- 采集视频源和音频源的数据
- 对原始数据进行H264编码和AAC编码
- 视频和音频数据封装为MPEG-TS包
- HLS分段生成策略及m3u8索引文件
- HTTP传输协议
HLS分段生成策略和m3u8:
分段策略
- HLS的分段策略,基本上推荐是10秒一个分片,当然,具体时间还要根据分好后的分片的实际时长做标注
- 通常来说,为了缓存等方面的原因,在索引文件中会保留最新的三个分片地址,以类似“滑动窗口”的形式,进行更新。
m3u8文件简介
m3u8,是HTTP Live Streaming直播的索引文件。m3u8基本上可以认为就是.m3u格式文件,区别在于,m3u8文件使用UTF-8字符编码。
- #EXTM3U m3u文件头,必须放在第一行
- #EXT-X-MEDIA-SEQUENCE 第一个TS分片的序列号
- #EXT-X-TARGETDURATION 每个分片TS的最大的时长
- #EXT-X-ALLOW-CACHE 是否允许cache
- #EXT-X-ENDLIST m3u8文件结束符
- #EXTINF extra info,分片TS的信息,如时长,带宽等
m3u8索引文件示例如下:
- #EXTM3U
- #EXT-X-MEDIA-SEQUENCE:0
- #EXT-X-TARGETDURATION:10
- #EXTINF:10,
- live_00000_.ts
- #EXTINF: 10,
- live_00001_.ts
- #EXTINF: 10,
- live_00002_.ts
- #EXTINF: 10,
- live_00003_.ts
- #EXTINF: 10,
- live_00004_.ts
- #EXTINF: 10,
- live_00005_.ts
- #EXTINF: 10,
- live_00006_.ts
- #EXTINF: 10,
- live_00007_.ts
- #EXTINF: 10,
- live_00008_.ts
- #EXTINF: 10,
- live_00009_.ts
- #EXT-X-ENDLIST