详解m3u8协议

阅读本文前 , 可以看看前面文章 , 便于理解 。
详细分析HLS框架
手把手配置HLS流媒体服务器
1.简述
官方文档地址:
如果需要更详细了解这个协议 , 就需要阅读这个协议 。
详解m3u8协议文章插图
3.HLS 协议编码格式要求
HLS协议对编码格式有如下要求 , 一般只支持这几种格式:
(1)视频的编码格式:H264 。
(2)?频的编码格式:AAC、MP3、AC-3 。
(3)视频的封装格式:ts 。
(4)保存 ts 索引的 m3u8 ?件 。
3.1 HLS 协议优点
(1)HLS 相对于 RTMP 来讲使?了标准的 HTTP 协议来传输数据 , 可以避免在?些特殊的?络环境下被屏蔽 。
(2)HLS 相? RTMP 在服务器端做负载均衡要简单得多 。 因为 HLS 是基于?状态协议 HTTP 实现的 , 拉流端只需要按照顺序使?下载存储在服务器的普通 ts ?件进?播放就可以 。 ? RTMP 是?种有状态协议 , 很难对视频服务器进?平滑扩展 , 因为需要为每?个播放视频流的拉流端维护状态 。
(3)HLS 协议本身实现了码率?适应 , 在不同带宽情况下 , 设备可以?动切换到最适合??码率的视频播放 。 这一点是非常好的一项功能 , 要是需要重点关注 。
【详解m3u8协议】3.2 HLS 协议缺点
HLS 协议在直播的视频延迟时间很难做到 10 s 以下延时 , ? RTMP 协议的延时可以降到 1s 左右 , 甚至1s以下 。
在这里提醒各位朋友 , 不管怎样 , 这两种方案都是有应用的 , 需要根据自己的需求和应用场景 , 选择不同的方案 。 不能只看的协议的缺点 , 而不看协议的优点 。
4.协议其它概念解析
(1)Playlist file
?个 m3u 的 Playlist 就是?个由多个独??组成的?本?件 , 每?由回?/换?区分 。 每??可以是?个URI、空??或是?个 以 "#" 号开头的字符串 , 并且空格只能存在于??中不同元素间的分隔 。 ?个 URI 表示?个媒体段或是 "variant Playlist file"(最多?持?层嵌套 , 即?个 m3u8 ?件中嵌套另?个 m3u8) , 以 "EXT" 开头的表示?个 "tag" , 否则表示注释 , 直接忽略 。
(2)Tags解析
#EXTM3U :每个 m3u8 ?件第??必须是这个 tag , 如上?的两个示例 。
#EXT-X-VERSION:m3u8?件版本号 , ?如#EXT-X-VERSION:3 。
#EXTINF :指定每个媒体段(ts)的持续时间 , 这个仅对其后?的 URI 有效 , 每两个媒体段 URI 间被这个 tag 分隔开其格式为: #EXTINF:, ,?如#EXTINF:14.357, nodesc
duration:表示持续的时间(秒) , "Durations MUST be integers if the protocol version of the Playlist file is less than 3"(如果版本号小于3 , 就是整数) , 否则可以是浮点数 。
#EXT-X-BYTERANGE :表示媒体段是?个媒体 URI 资源中的?段 , 只对其后的 media URI 有效 , 格式为: #EXT-X-BYTERANGE:[@o] 。 这个字段在版本4才有体现 。
n:表示这个区间的??
o:表示在 URI 中的 offset
#EXT-X-TARGETDURATION :指定当前视频流中的单个切?(即 ts)?件的最?时?(秒) 。 所以#EXTINF 中指定的时间?度必须?于或是等于这个最?值 。 这个 tag 在整个 Playlist ?件中只能出现?次(在嵌套的情况下 , ?般有真正ts url 的 m3u8 才会出现该 tag) 。 格式为: #EXT-X-TARGETDURATION:
s:表示最?的秒数 。
#EXT-X-MEDIA-SEQUENCE :每?个 media URI 在 Playlist 中只有唯?的序号 , 相邻之间序号 +1 。 格式为: #EXT-X-MEDIA-SEQUENCE:。 ?个 media URI 并不是必须要包含的 , 如果没有 , 默认为 0.
#EXT-X-KEY :表示怎么对 media segments 进?解码 。 其作?范围是下次该 tag 出现前的所有media URI 。 格式为: #EXT-X-KEY:NONE 或者 AES-128 。 如果是 NONE , 则 URI 以及 IV 属性必须不存在 , 如果是 AES-128(Advanced Encryption Standard) , 则 URI 必须存在 , IV 可以不存在 。 对于 AES-128 的情况 , keytag 和 URI 属性共同表示了?个 key ?件 , 通过 URI 可以获得这个key , 如果没有 IV(Initialization Vector) , 则使?序列号作为 IV 进?编解码 , 将序列号的?位赋到 16 个字节的 buffer 中 , 左边补 0;如果有 IV , 则将该值当成 16 个字节的 16 进制数 。


推荐阅读