一直都是在搜索查询别人分享的技术总结和经验,自己也总是在一个接着一个项目的去做,没有停下脚步来做自己的总结和分享,最近做的项目接触到HLS相关的协议问题,正好学习总结,将相关的经验总结记录下来,希望自己能够将学习应用过的知识系统化,也希望能够与相关从业的码农们多多交流,欢迎大家提出宝贵意见。
进入正题,先进行一些介绍:
HLS (HTTP Live Streaming)是动态码率自适应技术,核心包括m3u8的索引文件,ts媒体分片文件和key加密串文件,该技术基于HTTP的流媒体传输协议。
HLS 协议正在逐渐的发展,目前网络上主要是 HLS V3/V4/V5 协议,可以根据 IETF 的 HLS 官方文档和 RFC 文档进行了解。
相关链接:https://tools.ietf.org/html/draft-pantos-http-live-streaming-00
相关历史简要:
文档 | 时间 | 版本 | 更新 |
草案00 | 2009/06/08 | V1 | 初始版本 |
草案02 | 2009/10/05 | V2 | 1、加入 EXT-X-DISCONTINUITY 标签。 此标签提示播放器重置编码参数、文件格式、时 间戳等内容。 可用于将数段视频放到一个 M3U8 中,比如无缝 在视频内插入广告内容。 2、增加对 HTTP 头中 Content-Type 的要求。 规定视频索引的 MIME 为’application/vnd.apple.mpegurl’; 3、支持了冗余流。 这个特性对增强流的可用性起到了相当大的作 用,且给视频 CDN 的可用性架构留下了腾挪空 间; |
草案05 | 2010/11/19 | V3 | 允许在 EXTINF 标签中指定小数的文件片时长。 这是一个特别迫切的需求; 之前的版本规定文件片时长只能是整数。本来一 片也只有几秒钟,抹去小数位会对客户端 seek 和 buffer 的计算精度产生相当的影响度。 |
草案07 | 2011/09/30 | V4 | 1、增加了 EXT-X-BYTERANGE 标签。 此标签用以说明指定 URI 的某个偏移之后才是提 供给 HLS 的文件片; 此功能有助于原先全是的大文件的视频供应商们 往 HLS 的迁移; 2、可以在 EXT-X-STREAM-INF 标签的属性列表 中直接指明当前流是 VIDEO 还是 AUDIO; 3、增加了 EXT-X-MEDIA 标签。 此标签用于指定与主播出流相同地位的一些可替 代流; 可以基于此标签实现多音轨选择或者多机位多视 角的切换; 4、增加了 EXT-X-I-FRAMES-ONLY 和 EXT-X-I-FRAME-STREAM-INF 标签。 如果它们存在,说明播出流是一个只包含 I 帧的流;可利用此功能实现类似 GIF 或者数字电影的功能; |
草案09 | 2012/09/22 | V5 | 1、新增了 EXT-X-MAP 标签。 此标签用于指示在 EXT-X-I-FRAMES-ONLY 的 流中如何获取 MPEGTS 的 PAT/PMT 信息; 通常是另附 URI 的方式。 2、给 EXT-X-KEY 标签增加了 KEYFORMAT 和 KEYFORMATVERSIONS 属性。 用以详细说明加密密钥的打包方式; 3、通过扩展 EXT-X-STREAM-INF 和 EXT-X-MEDIA 标签支持了字幕功能; |
草案 12 | 2013/10/14 | V6 | 1、允许不包含 EXT-X-I-FRAMES-ONLY 标签的 流使用 EXT-X-MAP; 2、删除 EXT-X-STREAM-INF 和 EXT-X-I-FRAME-STREAM-INF 标签的 PROGRAM-ID 属性。 |
草案 14 | 2014/10/14 | V7 | 文档结构做了很大的调整; 支持 EXT-X-MEDIA 标签的 INSTREAM-ID 有 SERVICE 值,3. EXT-X-ALLOW-CACHE 标签 被移除 |
草案 23 | 2017/03/22 | V7 | 最新文档 |
RFC8216 | 2017/08 | V7 | RFC 发布 |
由于自身项目需求,后续所有的内容都是基于V3或者V5版本来进行分享。
一般播放流程图及HLS所处位置: