Skip to content

Latest commit

 

History

History
84 lines (64 loc) · 6.01 KB

File metadata and controls

84 lines (64 loc) · 6.01 KB

M3U8

M3U8是一种常见的流媒体格式,主要以文件列表的形式存在,既支持直播又支持点播,尤其在Android、iOS等平台最为常用,下面就来看一下M3U8的最简单的例子:

#EXTM3U    // m3u8文件头
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:3.760000,
out0.ts
#EXTINF:1.880000,
out1.ts
#EXTINF:1.760000,
out2.ts
#EXTINF:1.040000,
out3.ts
#EXTINF:1.560000,
out4.ts

从这个例子中可以看到如下几个字段,其含义具体如下:

  • EXTM3U

M3U8文件必须包含的标签,并且必须在文件的第一行,所有的M3U8文件中必须包含这个标签。

  • EXT-X-VERSION

M3U8文件的版本,常见的是3,其实版本已经发展了很多了,直至截稿时,已经发布到了版本7,经历了这么多版本,期间也对不少标记进行了增删。例如在版本2以后支持了EXT-X-KEY标签,在版本3以后支持了浮点EXTINF的duration值,在版本4以后支持了EXT-X-BYTERAGE标签与EXT-X-I-FRAMES-ONLY标签,在版本5以后支持了EXT-X-KEY的格式说明KEYFORMAT与KEYFORMATVE-RSION标签以及EXT-X-MAP标签,在版本6以后支持了EXT-X-MAP标签里面不包含EXT-X-I-FRAMES-ONLY标签。当然,也在一些版本中删除了一些标签,例如版本6中删掉了EXT-X-STREAM-INF标签与EXT-X-I-FRAME-STREAM-INF标签,版本7中删除掉了EXT-X-ALLOW-CACHE标签等信息。

  • EXT-X-TARGETDURATION

每一个分片都会有一个分片自己的duration,这个标签是最大的那个分片的浮点数四舍五入后的整数值,例如1.02四舍五入后的整数为1,2.568四舍五入后的整数为3,如果在M3U8分片列表中的最大的duration的数值为5.001,那么这个EXT-X-TARGETDURATION值为5。

  • EXT-X-MEDIA-SEQUENCE

M3U8直播时的直播切片序列,当播放打开M3U8时,以这个标签的值为参考,播放对应的序列号的切片。当然关于客户端播放M3U8的标准还有更多的讲究,下面就来逐项进行介绍。分片必须是动态改变的,序列不能相同,并且序列必须是增序的。当M3U8列表中没有出现EXT-X-ENDLIST标签时,无论这个M3U8列表中有多少片分片,播放分片都是从倒数第三片开始播放,如果不满三片则不应该播放。当然,如果有些播放器特别定制了的话,则可以不遵照这个原则。如果前一片分片与后一片分片有不连续的时候播放可能会出错,那么需要使用EXT-X-DISCONTINUITY标签来解决这个错误。 以播放当前分片的duration时间刷新M3U8列表,然后做对应的加载动作。如果播放列表在刷新之后与之前的列表相同,那么在播放当前分片duration一半的时间内再刷新一次。

  • EXTINF EXTINF为M3U8列表中每一个分片的duration,如上面例子输出信息中的第一个分片的duration为4.120000秒;在EXTINF标签中除了duration值,还可以包含可选的描述信息,主要为标注切片信息,使用逗号分隔开。EXTINF下面的信息为具体的分片信息,分片存储路径可以为相对路径,也可以为绝对路径,也可以为互联网的URL链接地址。除了以上的这些标签之外,还有一些标签同样是常用的标签,具体如下。

  • EXT-X-ENDLIST 若出现EXT-X-ENDLIST标签,则表明该M3U8文件不会再产生更多的切片,可以理解为该M3U8已停止更新,并且播放分片到这个标签后结束。M3U8不仅仅是可以作为直播,也可以作为点播存在,在M3U8文件中保留所有切片信息最后使用EXT-X-ENDLIST结尾,这个M3U8即为点播M3U8。

  • EXT-X-STREAM-INF EXT-X-STREAM-INF标签出现在M3U8中时,主要是出现在多级M3U8文件中时,例如M3U8中包含子M3U8列表,或者主M3U8中包含多码率M3U8时;该标签后需要跟一些属性,下面就来逐一说明这些属性。

    • BANDWIDTH BANDWIDTH的值为最高码率值,当播放EXT-X-STREAM-INF下对应的M3U8时占用的最大码率,这个参数是EXT-X-STREAM-INF标签中必须要包含的属性。
    • AVERAGE-BANDWIDTH AVERAGE-BANDWIDTH的值为平均码率值,当播放EXT-X-STREAM-INF下对应的M3U8时占用的平均码率,这个参数是一个可选参数。
    • CODECS CODECS的值用于声明EXT-X-STREAM-INF下面对应M3U8里面的音频编码、视频编码的信息,例如,若AAC-LC的音频与视频为H.264 Main Profile、Level 3.0的话,则CODECS值为“mp4a.40.2, avc1.4d401e”,这个属性应该出现在EXT-X-STREAM-INF标签里,但是并不是所有的M3U8中都可以看到,仅供参考。
    • RESOLUTION M3U8中视频的宽高信息描述,这个属性是一个可选属性。
    • FRAME-RATE 子M3U8中的视频帧率,这个属性依然是一个可选属性。
      下面针对EXT-X-STREAM-INF举一个实际的例子:
    #EXTM3U
    #EXT-X-STREAM-INF:BANDWIDTH=1280000, AVERAGE-BANDWIDTH=1000000
    http://example.com/low.m3u8
    #EXT-X-STREAM-INF:BANDWIDTH=2560000, AVERAGE-BANDWIDTH=2000000
    http://example.com/mid.m3u8
    #EXT-X-STREAM-INF:BANDWIDTH=7680000, AVERAGE-BANDWIDTH=6000000
    http://example.com/hi.m3u8
    #EXT-X-STREAM-INF:BANDWIDTH=65000, CODECS="mp4a.40.5"
    http://example.com/audio-only.m3u8
    

    在这个M3U8文件中,使用了4个EXT-X-STREAM-INF标签来标注子M3U8的属性:最高码率为1.28M、平均码率为1M的M3U8,最高码率为2.56M、平均码率为2M的M3U8,最高码率为7.68M、平均码率为6M的M3U8,以及只有65K的音频编码的M3U8。

FFmpeg中自带HLS的封装参数,使用HLS格式即可进行HLS的封装,但是生成HLS的时候有各种参数可以进行参考,例如设置HLS列表中切片的前置路径、生成HLS的TS切片时设置TS的分片参数、生成HLS时设置M3U8列表中保存的TS个数等:

Image

ffmpeg -re -i input.mp4 -c copy -f hls-bsf:v h264_mp4toannexb output.m3u8