天天看點

流媒體開發之--HLS--M3U8解析(1)

最近業餘時間跟朋友要搞一個流媒體直播app,是以這段時間搜集一些資料,然後整理下來,同時有時也會将一些遇到的問題的解決方案記錄下來,--因為分享,技術無處不在!首先這一章來講解一下m3u8檔案的格式,以及裡面的内容含義。

一、概念

1. Playlist file

    一個M3U的 Playlist 就是一個由多個獨立行組成的文本檔案,每行由回車/換行區分。每一行可以是一個URI  空白行或

是以”#“号開頭的字元串,并且空格隻能存在于一行中不同元素間的分隔。

   一個URI 表示一個媒體段或是”variant Playlist file“(最多支援一層嵌套,即一個mm3u8檔案中嵌套另一個m3u8),

以”#EXT“開頭的表示一個”tag“,否則表示注釋,直接忽略

2. Tags

    #EXTM3U:  每個M3U檔案第一行必須是這個tag。

    #EXTINF:指定每個媒體段(ts)的持續時間,這個僅對其後面的URI有效,每兩個媒體段URI間被這個tag分隔開,其格式如下:

                     #EXTINF:<duration>,<title>  :

  duration表示持續的時間(秒)”Durations MUST be integers if the protocol version of the Playlist file is less

than 3“,否則可以是浮點數。

    #EXT-X-BYTERANGE:表示媒體段是一個媒體URI資源中的一段,隻對其後的media URI有效,格式如下:

                     #EXT-X-BYTERANGE:<n>[@o]:

  其中n表示這個區間的大小,o表在URI中的offset;”The EXT-X-BYTERANGE tag appeared in version 4 of the protocol“。

    #EXT-X-TARGETDURATION:指定最大的媒體段時間長(秒)。是以#EXTINF中指定的時間長度必須小于或是等于這個最大

值。這個tag在整個PlayList檔案中隻能出現一 次(在嵌套的情況下,一般有真正ts url的m3u8才會出現該tag)。格式如下:

                     #EXT-X-TARGETDURATION:<s>:s表示最大的秒數。

    #EXT-X-MEDIA-SEQUENCE:每一個media URI 在 PlayList中隻有唯一的序号,相鄰之間序号+1。

                     #EXT-X-MEDIA-SEQUENCE:<number>:

                    一個media URI并不是必須要包含的,如果沒有,預設為0。

    #EXT-X-KEY:表示怎麼對media segments進行解碼。其作用範圍是下次該tag出現前的所有media URI,格式如下:

                     #EXT-X-KEY:<attribute-list>:

                    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進制數。

    #EXT-X-PROGRAM-DATE-TIME:将一個絕對時間或是日期和一個媒體段中的第一個sample相關聯,隻對下一個meida URI有效,格式如下:

                     #EXT-X-PROGRAM-DATE-TIME:<YYYY-MM-DDThh:mm:ssZ>

                     For example:

                     #EXT-X-PROGRAM-DATE-TIME:2010-02-19T14:54:23.031+08:00

   #EXT-X-ALLOW-CACHE:是否允許做cache,這個可以在PlayList檔案中任意地方出現,并且最多出現一次,作用效果是所有的媒體段。格式如下:

                     #EXT-X-ALLOW-CACHE:<YES|NO>

   #EXT-X-PLAYLIST-TYPE: 提供關于PlayList的可變性的資訊, 這個對整個PlayList檔案有效,是可選的,格式如下:

                     #EXT-X-PLAYLIST-TYPE:<EVENT|VOD> :如果是VOD,則伺服器不能改變PlayList 檔案;如果是EVENT,則

伺服器不能改變或是删除PlayList檔案中的任何部分,但是可以向該檔案中增加新的一行内容。

   #EXT-X-ENDLIST:表示PlayList的末尾了,它可以在PlayList中任意位置出現,但是隻能出現一個,格式如下:

                     #EXT-X-ENDLIST

   #EXT-X-MEDIA:被用來在PlayList中表示相同内容的不用語種/譯文的版本,比如可以通過使用3個這種tag表示3中不用語音的音

頻,或者用2個這個tag表示不同角度的video在PlayLists中。這個标簽是獨立存在的,其格式如下:

                    #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。

o All EXT-X-MEDIA tags in the same group MUST have the same TYPE

attribute.

o All EXT-X-MEDIA tags in the same group MUST have different NAME

attributes.

o A group MUST NOT have more than one member with a DEFAULT

attribute of YES.

o All members of a group whose AUTOSELECT attribute has a value of

YES MUST have LANGUAGE [RFC5646] attributes with unique values.

o All members of a group with TYPE=AUDIO MUST use the same audio

sample format.

o All members of a group with TYPE=VIDEO MUST use the same video

sample format。

  #EXT-X-STREAM-INF:指定一個包含多媒體資訊的 media URI 作為PlayList,一般做M3U8的嵌套使用,它隻對緊跟後面的URI有

效,格式如下:

#EXT-X-STREAM-INF:<attribute-list>

<URI>

有以下屬性:

BANDWIDTH:帶寬,必須有。

PROGRAM-ID:該值是一個十進制整數,惟一地辨別一個在PlayList檔案範圍内的特定的描述。一個PlayList 檔案中可

能包含多個有相同ID的此tag。

CODECS:不是必須的。

RESOLUTION:分辨率。

AUDIO:這個值必須和AUDIO類别的“EXT-X-MEDIA”标簽中“GROUP-ID”屬性值相比對。

VIDEO:同上

m3u8的組成格式有多種,下面給出一個執行個體,http://ipadlive.cntv.soooner.com/cctv_p2p_hdcctv2.m3u8這個是CCTV-2财經的一個源,内容如下

#EXTM3U

#EXT-X-ALLOW-CACHE:NO

#EXT-X-TARGETDURATION:10

#EXT-X-MEDIA-SEQUENCE:8453235

#EXTINF:19,

http://124.232.164.44:80/ipad/160_15601_4572/20130804075250.ts?userid=VSNDNP-183061027101_160_15601_4572

#EXTINF:2,

http://124.232.164.44:80/ipad/160_15601_4572/20130804075300.ts?userid=VSNDNP-183061027101_160_15601_4572

#EXTINF:10,

http://124.232.164.44:80/ipad/160_15601_4572/20130804075310.ts?userid=VSNDNP-183061027101_160_15601_4572

如果是這種的話,就很友善其中http一行就是完整的一個連結,否則還要進行拼接。

下一章會給出一個HLS的一個中文版的草案