m3u8文件格式

简介背景:

  • m3u8是苹果公司推出的视频播放标准,是m3u的一种变体,u8是表示采用utf-8编码格式,专门针对Unicode字符集优化。
  • m3u是一种通用的多媒体播放列表格式,而m3u8文件本质上一个文本索引文件。

Tag参数:

  • #EXTM3U:每个m3u文件的第一行必须是这个tag,标示作用
  • #EXT-X-VERSION:该属性不是必须的,版本号
  • #EXT-XMEDIA-SEQUENCE:每一个Media URI再PlayList只有唯一序号,相邻之间序号+1,一个Media URI并不是必须包含的,如果没有,默认为0
  • #EXT-X-TARGETDURATION:所有切片最大的时长(单位秒)。有些APPLE设备这个参数不正确无法播放。
  • #EXTINF:ts切片的实际时长。
  • #EXT-X-BYTERANGE:表示媒体段是一个媒体URI资源中的一段,只对其后的Media URI有效。格式为:EXT-X-BYTERANGE<N>[@o]
    • n:表示这个区间的大小
    • o:表示在这个URI中的offset
  • #EXT-X-ENDLIST:表示文件的结束,live m3u8没有该tag。它可以在PlayList中任意位置出现,但是只能出现一个。
  • #EXT-X-PLAYLIST-TYPE:提供关于PlayList的可变信息,这个对整个PlayList文件有效,是可选的。格式如下: #EXT-X-PLAYLIST-TYPE:<EVENT | VOD>
    • VOD,即为点播视频,服务器不能改变PlayList文件,换句话说就是该视频全部的ts已经生成好了。
    • EVETN,就是实时生成的m3u8和ts文件。服务器不能改变或是删除PlayList文件的任何部分,但是可以向该文件中新增一行内容。它的索引文件一直处于动态变化中,播放的时候需不断下载二级index文件。
  • #EXT-X-ALLOW-CACHE:是否允许做cache,这个可以在PlayList文件中任意地产出现,并且最多只出现一次,作用 是所有媒体段。格式如下:#EXT-X-ALLOW-CACHE:<YES|NO>
  • #EXT-X-PROGRAM-DATE-TIME:将一个绝对时间或是日期和一个媒体段中的第一个stamlpe相关联,只对下一个media URI有效,格式如下:: #EXT-X-PROGRAM-DATE-TIME:<YYYY-MM-DDThh:mm:ssZ>
    • 例如: #EXT-X-PROGRAM-DATE-TIME:2010-02-19T14:54:23.031+08:00
  • #ZEN-TOTAL-DURATION:表示这个m3u8所含ts的总时间长度
  • #EXT-X-DISCONTINUITY:当遇到该tag的时候说明一下属性发生了变化:
    • file format 文件格式
    • number and type of tracks 轨道
    • encoding parameters 编码参数
    • encoding squence 编码序号
    • timestamp sequence 时间戳序号
  • #EXT-X-STREAM-INF:指定一个包含多媒体信息的Media URI作为PlayList,一般m3u8的嵌套使用,他只对紧跟后面的URI有效,格式如下:#EXT-X-STREAM-INF:<attribute-list>
    • 常用属性如下:
      • BANDWIDTH:带宽,必须有
      • PROGRAM-ID:该值是一个10进制整数,唯一的标识一个在PlayList文范围内的特定描述。一个PlayList文件中可能包含多个相同的ID的此tag。
      • CODECS:指定流的编码类型,不是必须
      • RESOLUTION:分辨率
      • AUDIO:这个值必须和AUDIO类别的”EXT-X-MEDIA”标签中”GROUP-ID”属性值相匹配
      • VIDEO:同AUDIO
  • #EXT-X-MEDIA:被用来在PlayList中表示相同内容不同语种/译文的版本,比如可以通过使用3个这种tag表示3种不同语音的音频,或者用2个这个tag表示不同角度的video。在PlayList中,这个标签是独立存在的,其格式如下: #EXT-X-MEDIA:<attribute-list>
    • 该属性列表中包含:URI、TYPE、GROUP-ID、LANGUAGE、NAME、DEFAULT、AUTOSELECT。
    • URI:如果没有,则表示这个 tag 描述的可选择版本在主 PlayList 的 EXT-X-STREAM-INF 中存在
    • TYPE:AUDIO and VIDEO
    • GROUP-ID:具有相同 ID 的 MEDIAtag,组成⼀组样式
    • LANGUAGE:identifies the primary language used in the rendition
    • NAME:The value is a quoted-string containing a human-readable description of the rendition. If the LANGUAGE attribute is present then this description SHOULD be in that language
    • DEFAULT:YES 或是 NO,默认是 No,如果是 YES,则客户端会以这种选项来播放,除⾮⽤户⾃⼰进⾏选择
    • AUTOSELECT:YES 或是 NO,默认是 No,如果是 YES,则客户端会根据当前播放环境来进⾏选择(⽤户没有根据⾃⼰偏好进⾏选择的前提下)
    • The EXT-X-MEDIA tag appeared in version 4 of the protocol。

Playlist file:

⼀个 m3u 的 Playlist 就是⼀个由多个独⽴⾏组成的⽂本⽂件,每⾏由回⻋/换⾏区分。每⼀⾏可以是⼀个URI、空⽩⾏或是⼀个 以 “#” 号开头的字符串,并且空格只能存在于⼀⾏中不同元素间的分隔。⼀个 URI 表示⼀个媒体段或是 “variant Playlist file”(最多⽀持⼀层嵌套,即⼀个 m3u8 ⽂件中嵌套另⼀个 m3u8),以 “EXT” 开头的表示⼀个 “tag”,否则表示注释,直接忽略。

每一个.m3u8文件,分别对应若干个ts文件,这些ts文件才是真正放视频的数据。m3u8文件只是存放了一些ts文件的配置信息和相关路径,当视频播放时,.m3u8文件是动态改变的。解析这个文件,并找到对应的ts文件来播放,所以一般web服务器存放.m3u8文件,cdn存放ts文件。

示例:

  • 单码率适配流
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXT-X-MEDIA-SEQUENCE:2
#EXT-X-TARGETDURATION:16
#EXTINF:14.357,no desc
livestream-2.ts
#EXTINF:14.357,no desc
livestream-3.ts
#EXTINF:14.357,no desc
livestream-4.ts
  • 多码率适配流
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000
http://example.com/low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000
http://example.com/mid.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000
http://example.com/hi.m3u8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注