m3u8

1.   M3U8文件概念

M3U8文件是指UTF-8編碼格式的M3U文件。M3U文件是記錄了一個索引純文本文件,打開它時播放軟件並非播放它,而是根據它的索引找到對應的音視頻文件的網絡地址進行在線播放。vim

2.   M3U8文件舉例

例如使用雲圖TV點播直播節目時,發送請求:瀏覽器

http://121.199.63.236:7613/m3u8/cckw1/szws.m3u8?from=bab&fun=yes&chk=y&chunk=xax&ppw=yuntutv&auth=yuntutvyuntutvyuntutv&auth=yuntutvyuntutvyuntutv&nwtime=1406515232&sign=033d5483609e6bc87987fc7d2f30a024服務器

返回M3U8文件,文件內容以下:網絡

#EXTM3Uapp

#EXT-X-MEDIA-SEQUENCE:140651513iphone

#EXT-X-TARGETDURATION:10ide

#EXTINF:8,編碼

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651513[140651513].tsurl

#EXTINF:9,spa

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514[140651514].ts

#EXTINF:11,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651515[140651515].ts

#EXTINF:10,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651516[140651516].ts

#EXTINF:12,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651517[140651517].ts

#EXTINF:8,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651518[140651518].ts

#EXTINF:12,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651519[140651519].ts

#EXTINF:8,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651520[140651520].ts

#EXTINF:9,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651521[140651521].ts

#EXTINF:13,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651522[140651522].ts

而後根據索引的中連接請求下載音視頻並進行播放

3.   M3U文件標籤及屬性說明

M3U文件中能夠包含多個tag,每一個tag的功能和屬性以下:

#EXTM3U

每一個M3U文件第一行必須是這個tag,請標示做用

#EXT-X-MEDIA-SEQUENCE:140651513 

每個media URI 在 PlayList中只有惟一的序號,相鄰之間序號+1, 一個media URI並非必需要包含的,若是沒有,默認爲0

#EXTINF:,

 duration 指定每一個媒體段(ts)的持續時間(秒),僅對其後面的URI有效,title是下載資源的url

#EXT-X-TARGETDURATION

指定最大的媒體段時間長(秒)。因此#EXTINF中指定的時間長度必須小於或是等於這個最大值。這個tag在整個PlayList文件中只能出現一 次(在嵌套的狀況下,通常有真正ts url的m3u8纔會出現該tag)

#EXT-X-KEY

表示怎麼對media segments進行解碼。其做用範圍是下次該tag出現前的全部media URI,屬性爲NONE 或者 AES-128。NONE表示 URI以及IV(Initialization Vector)屬性必須不存在, AES-128(Advanced EncryptionStandard)表示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:

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:

#EXT-X-PLAYLIST-TYPE

提供關於PlayList的可變性的信息, 這個對整個PlayList文件有效,是可選的,格式以下:#EXT-X-PLAYLIST-TYPE::若是是VOD,則服務器不能改變PlayList 文件;若是是EVENT,則服務器不能改變或是刪除PlayList文件中的任何部分,可是能夠向該文件中增長新的一行內容。

#EXT-X-ENDLIST

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

#EXT-X-MEDIA

被用來在PlayList中表示相同內容的不用語種/譯文的版本,好比能夠經過使用3個這種tag表示3中不用語音的音頻,或者用2個這個tag表示不一樣角度的video在PlayLists中。這個標籤是獨立存在的,屬性包含:

  URI:若是沒有,則表示這個tag描述的可選擇版本在主PlayList的EXT-X-STREAM-INF中存在;

  TYPE:AUDIO and VIDEO;

  GROUP-ID:具備相同ID的MEDIAtag,組成一組樣式;

  LANGUAGE:肯定使用的主要語言

  NAME:人類可讀的語言的翻譯

  DEFAULT:YES或是NO,默認是No,若是是YES,則客戶端會以這種選項來播放,除非用戶本身進行選擇。

  AUTOSELECT:YES或是NO,默認是No,若是是YES,則客戶端會根據當前播放環境來進行選擇(用戶沒有根據本身偏好進行選擇的前提下)

#EXT-X-STREAM-INF

指定一個包含多媒體信息的 media URI 做爲PlayList,通常作M3U8的嵌套使用,它只對緊跟後面的URI有效,格式以下:#EXT-X-STREAM-INF:有如下屬性:

BANDWIDTH:帶寬,必須有。

PROGRAM-ID:該值是一個十進制整數,唯一地標識一個在PlayList文件範圍內的特定的描述。一個PlayList 文件中可能包含多個有相同ID的此tag。

CODECS:不是必須的。

RESOLUTION:分辨率。

AUDIO:這個值必須和AUDIO類別的「EXT-X-MEDIA」標籤中「GROUP-ID」屬性值相匹配。

VIDEO:同上



首先是名詞介紹,什麼是m3u8。m3u8是m3u的一種,不過是utf-8格式的,我記憶中說m3u8是蘋果公司搞出來的一種播放的標準吧,其實簡單來講就是把整個視頻切成一段一段的,而後呢用一個m3u8格式來存這些個小段視頻們的地址。可能你們就要問了,這麼麻煩幹嗎。其實m3u8是爲了碼率適配而生,而怎樣去適配碼率呢,這個下面介紹格式的時候會介紹到。

上兩個m3u8文件的例子地址,你們能有直觀的認識,這是我從Vitamio的官網上扒的。

http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8
http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8


我總結了一下我遇到的m3u8格式,雖然不能說涵蓋了所有的狀況,可是也差很少了:

一、一級目錄(我覺着一級的目錄沒有適配碼率的功能)

1.一、打開第一級m3u8文件,能找到真正的視頻地址

1.二、第一級m3u8文件中,沒有真正的視頻地址,須要拼接才能找到真正的視頻地址

二、二級目錄

2.一、二級地址在一級文件中直接能看到

2.二、二級地址在一級文件中不能直接看到,須要拼接一級連接的地址才能找到二級文件的地址

2.二、打開二級目錄,能找到整整的視頻地址

2.三、沒有真正的視頻地址,須要拼接才能找到真正的視頻地址


篇幅關係我不能給你們所有列舉出這些所有的可能性。我就拿最麻煩的舉個例子,其餘的你們自行腦補吧,原理都是同樣的,怎麼樣都跑不出協議的範疇以外。

咱們在瀏覽器中輸入http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8,會獲得一個名爲bipbopall.m3u8的文件,此文件的內容以下:

#EXTM3U

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000

gear1/prog_index.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=311111

gear2/prog_index.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=484444

gear3/prog_index.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=737777

gear4/prog_index.m3u8

這就符合上面的2.2種狀況,這四種碼率的m3u8的地址你都不能直接獲得,那怎麼辦呢,咱們用獲得這個文件的連接地址的前半段http://devimages.apple.com/iphone/samples/bipbop/拼接上二級文件的相對地址gear1/prog_index.m3u8獲得一個地址http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8

把此地址放到瀏覽器中,咱們又會獲得一個一樣名爲prog_index.m3u8的文件,內容以下:

#EXTM3U

#EXT-X-TARGETDURATION:10

#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:10, no desc

fileSequence0.ts

#EXTINF:10, no desc

fileSequence1.ts

#EXTINF:10, no desc

fileSequence2.ts

#EXTINF:10, no desc

fileSequence3.ts

#EXTINF:10, no desc

fileSequence4.ts

#EXTINF:10, no desc

fileSequence5.ts

#EXTINF:10, no desc

.

.

.

#EXTINF:10, no desc

fileSequence179.ts

#EXTINF:1, no desc

fileSequence180.ts

#EXT-X-ENDLIST

咱們很開心的發現,這設計簡直是巧(sang)奪(xin)天(bing)工(kuang),咱們仍是沒有獲得真正的視頻地址,老辦法拼接後咱們獲得這麼一段鏈http://devimages.apple.com/iphone/samples/bipbop/gear1/fileSequence179.ts,這就是真正的視頻地址。

我舉的這個例子是最複雜的狀況,通常的狀況對於這個來講都是相對簡單的。就跟軟件設計同樣,咱們先考慮到最可貴狀況,簡單的來講就迎刃而解了

相關文章
相關標籤/搜索