最近在做視頻下載,本地播放功能的時候,發(fā)現(xiàn)的問題,先筆記記錄一下
開發(fā)思路
(1) 在線解析m3u8文件內(nèi)容,把里面的ts對應(yīng)連接的資源下載本地的Document文件下。
?(2) 把下載下來的資源使用本地路徑重新拼接成一個新的本地m3u8文件。
(3) 然后在開啟一個http服務(wù)端,把m3u8共享成連接地址,讓播放器播放。
一、概念
1. Playlist file
一個M3U的 Playlist 就是一個由多個獨立行組成的文本文件,每行由回車/換行區(qū)分。每一行可以是一個URI? 空白行或
是以”#“號開頭的字符串,并且空格只能存在于一行中不同元素間的分隔。
一個URI 表示一個媒體段或是”variant Playlist file“(最多支持一層嵌套,即一個mm3u8文件中嵌套另一個m3u8),
以”#EXT“開頭的表示一個”tag“,否則表示注釋,直接忽略
2. Tags
#EXTM3U:? 每個M3U文件第一行必須是這個tag。
#EXTINF:指定每個媒體段(ts)的持續(xù)時間,這個僅對其后面的URI有效,每兩個媒體段URI間被這個tag分隔開,其格式如下:
#EXTINF:,? :
duration表示持續(xù)的時間(秒)”Durations MUST be integers if the protocol version of the Playlist file is less
than 3“,否則可以是浮點數(shù)。
#EXT-X-BYTERANGE:表示媒體段是一個媒體URI資源中的一段,只對其后的media URI有效,格式如下:
#EXT-X-BYTERANGE:[@o]:
其中n表示這個區(qū)間的大小,o表在URI中的offset;”The EXT-X-BYTERANGE tag appeared in version 4 of the protocol“。
#EXT-X-TARGETDURATION:指定最大的媒體段時間長(秒)。所以#EXTINF中指定的時間長度必須小于或是等于這個最大
值。這個tag在整個PlayList文件中只能出現(xiàn)一 次(在嵌套的情況下,一般有真正ts url的m3u8才會出現(xiàn)該tag)。格式如下:
#EXT-X-TARGETDURATION::s表示最大的秒數(shù)。
#EXT-X-MEDIA-SEQUENCE:每一個media URI 在 PlayList中只有唯一的序號,相鄰之間序號+1。
#EXT-X-MEDIA-SEQUENCE::
一個media URI并不是必須要包含的,如果沒有,默認(rèn)為0。
#EXT-X-KEY:表示怎么對media segments進(jìn)行解碼。其作用范圍是下次該tag出現(xiàn)前的所有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進(jìn)行編解碼,將序列號的高位賦到16個字節(jié)的buffer中,左邊補0;如果
有IV,則將改值當(dāng)成16個字節(jié)的16進(jìn)制數(shù)。
#EXT-X-PROGRAM-DATE-TIME:將一個絕對時間或是日期和一個媒體段中的第一個sample相關(guān)聯(lián),只對下一個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文件中任意地方出現(xiàn),并且最多出現(xiàn)一次,作用效果是所有的媒體段。格式如下:
#EXT-X-ALLOW-CACHE:
#EXT-X-PLAYLIST-TYPE: 提供關(guān)于PlayList的可變性的信息, 這個對整個PlayList文件有效,是可選的,格式如下:
#EXT-X-PLAYLIST-TYPE: :如果是VOD,則服務(wù)器不能改變PlayList 文件;如果是EVENT,則
服務(wù)器不能改變或是刪除PlayList文件中的任何部分,但是可以向該文件中增加新的一行內(nèi)容。
#EXT-X-ENDLIST:表示PlayList的末尾了,它可以在PlayList中任意位置出現(xiàn),但是只能出現(xiàn)一個,格式如下:
#EXT-X-ENDLIST
#EXT-X-MEDIA:被用來在PlayList中表示相同內(nèi)容的不用語種/譯文的版本,比如可以通過使用3個這種tag表示3中不用語音的音
頻,或者用2個這個tag表示不同角度的video在PlayLists中。這個標(biāo)簽是獨立存在的,其格式如下:
#EXT-X-MEDIA::該屬性列表中包含: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,默認(rèn)是No,如果是YES,則客戶端會以這種選項來播放,除非用戶自己進(jìn)行選擇。
AUTOSELECT:YES或是NO,默認(rèn)是No,如果是YES,則客戶端會根據(jù)當(dāng)前播放環(huán)境來進(jìn)行選擇(用戶沒有根據(jù)自己偏好進(jìn)行選擇的前提下)。
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:
有以下屬性:
BANDWIDTH:帶寬,必須有。
PROGRAM-ID:該值是一個十進(jìn)制整數(shù),惟一地標(biāo)識一個在PlayList文件范圍內(nèi)的特定的描述。一個PlayList 文件中可
能包含多個有相同ID的此tag。
CODECS:不是必須的。
RESOLUTION:分辨率。
AUDIO:這個值必須和AUDIO類別的“EXT-X-MEDIA”標(biāo)簽中“GROUP-ID”屬性值相匹配。
VIDEO:同上
m3u8的組成格式有多種,下面給出一個實例,http://ipadlive.cntv.soooner.com/cctv_p2p_hdcctv2.m3u8這個是CCTV-2財經(jīng)的一個源,內(nèi)容如下
#EXTM3U
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:8453235
#EXTINF:19,
#EXTINF:2,
#EXTINF:10,
如果是這種的話,就很方便其中http一行就是完整的一個鏈接,否則還要進(jìn)行拼接。
目錄
1 簡介?2
2 概述?2
3 播放列表文件?3
3.1 介紹?3
3.2新標(biāo)簽?4
3.2.1?EXT-X-TARGETDURATION?4
3.2.2?EXT-X-MEDIA-SEQUENCE?4
3.2.3?EXT-X-KEY?4
3.2.4?EXT-X-PROGRAM-DATE-TIME?5
3.2.5?EXT-X-ALLOW-CATCH?5
3.2.6?EXT-X-ENDLIST?5
3.2.7?EXT-X-STREAM-INF?5
3.2.8?EXT-X-DISCONTINUITY?6
3.2.9?EXT-X-VERSION?6
4 多媒體文件?7
5 密鑰文件?7
5.1 介紹?7
5.2? IV FOR AES-128?7
6 客戶端/服務(wù)器行為?8
6.1 介紹?8
6.2 服務(wù)器進(jìn)程?8
6.2.1介紹?8
6.2.2 滑動窗口播放列表?9
6.2.3 加密媒體文件?9
6.2.4 提供變種數(shù)據(jù)流?10
6.3 客戶端進(jìn)程?10
6.2.1 介紹?10
6.2.2 加載播放列表文件?11
6.2.3播放播放列表文件?11
6.2.4重新載入播放列表文件?11
6.2.5 確定下一個要加載的文件?12
6.2.6 解密經(jīng)加密的媒體文件?12
7 協(xié)議版本的兼容性?12
8 例子?12
8.1 簡單的播放列表文件?12
8.2 滑動窗口播放列表,使用https?13
8.3 加密的媒體文件與播放列表文件?13
8.4 變種的播放列表文件?13
1?簡介
本文檔介紹了通過HTTP傳輸極大的多媒體數(shù)據(jù)流的協(xié)議[RFC2616]。該協(xié)議支持媒體數(shù)據(jù)的加密,并提供流的備用版本(如比特率)。媒體數(shù)據(jù)可以在創(chuàng)建后被很快地傳輸,允許它在近實時被接收。
在第11章中列出了,如HTTP的,描述相關(guān)標(biāo)準(zhǔn)的外部引用。
2?概述
3?播放列表文件
3.1介紹
播放列表必須是擴展的M3U文件,該文檔通過定義新的標(biāo)簽擴展了m3u文件的格式。M3U播放列表是一個文本文件,它包含了各自獨立的行,行以一個LF字符或者LF字符緊跟一個CR字符來結(jié)束。行可以是一個URI,空行,或者以字符#開頭。空行將會被忽略。空格只能作為一行中不同元素間的分隔。
一個URI?表示一個媒體文件或是變種播放列表文件(見3.2.7)
??? URI可以是相對的,一個相對的URI必須被包含該URI的播放列表文件中的URI所解析。
以注釋字符#開頭的行可能是注釋或者標(biāo)簽,標(biāo)簽以#EXT開頭,其他所有行都應(yīng)該被忽略。播放列表文件的持續(xù)時間是他所指向的媒體文件的時長的總和。
以.M3U8作為文件名后綴或者HTTPContent-Type(RFC2616)為“Application/vnd.apple.mpegurl”的M3U播放列表文件使用UTF-8(RFC3629)編碼。以.M3U作為文件名后綴或者HTTPContent-Type為“audio/mpegurl”的M3U播放列表文件使用US-ASCII編碼。
播放列表文件名必須以.M3U8為后綴、HTTPContent-Type為“Application/vnd.apple.mpegurl”(如果使用http傳輸)或者以.M3U為后綴、HTTPContent-Type為“audio/mpegurl”。
擴展的M3U文件格式定義了兩種標(biāo)簽:EXTM3U和EXTINF。區(qū)分?jǐn)U展的M3U文件與普通M3U文件的關(guān)鍵在于前者的首行為#EXTM3U。
EXTINF是一個記錄標(biāo)記,該標(biāo)記描述了后邊URI所指定的媒體文件。每個媒體文件URI前邊必須有EXTINF標(biāo)簽。格式如下:
#EXTINF: ,
DURATION是一個整數(shù),它指定了媒體文件以秒為單位的持續(xù)時間,時間應(yīng)四舍五入到最接近的整數(shù)。行內(nèi)逗號后邊的剩余部分是媒體文件的名字,該名字是媒體分片的人眼可讀的信息標(biāo)題。
該文檔定義了如下的新標(biāo)簽:EXT-X-TARGETDURATION,EXT-X-MEDIA-SEQUENCE,EXT-X-KEY,EXT-X-PROGRAM-DATE-TIME,EXT-X-ALLOW-CATCH,EXT-X-ENDLIST,EXT-X-STREAM-INF,EXT-X-DISCONTINUITY,EXT-X-VERSION
3.2新標(biāo)簽
3.2.1????? EXT-X-TARGETDURATION
3.2.2????? EXT-X-MEDIA-SEQUENCE
3.2.4????? EXT-X-PROGRAM-DATE-TIME
??? EXT-X-ENDLIST標(biāo)簽標(biāo)示沒有更多媒體文件將會加入到播放列表中,它可能會出現(xiàn)在播放列表文件的任何地方,但是不能出現(xiàn)兩次或以上。其格式如下:
#EXT-X-ENDLIST
#EXT-X-STREAM-INF:[attribute=value][,attribute=value]*
3.2.8????? EXT-X-DISCONTINUITY
4?多媒體文件
5?密鑰文件
5.1介紹
6?客戶端/服務(wù)器行為
6.1介紹
6.2服務(wù)器進(jìn)程
6.2.1介紹
6.2.2滑動窗口播放列表
6.2.3加密媒體文件
6.2.4提供變種數(shù)據(jù)流
6.3客戶端進(jìn)程
6.3.1介紹
6.3.2加載播放列表文件
6.3.3播放播放列表文件
6.3.4重新載入播放列表文件
6.3.5確定下一個要加載的文件
6.3.6解密經(jīng)加密的媒體文件
7?協(xié)議版本的兼容性
8?例子
8.1簡單的播放列表文件
#EXTM3U
#EXT-X-TARGETDURATION:5220
#EXTINF:5220,
http://media.example.com/entire.ts
#EXT-X-ENDLIST
8.2滑動窗口播放列表,使用https
#EXTM3U
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:2680
#EXTINF:8,
https://priv.example.com/fileSequence2680.ts
#EXTINF:8,
https://priv.example.com/fileSequence2681.ts
#EXTINF:8,
8.3加密的媒體文件與播放列表文件
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:7794
#EXT-X-TARGETDURATION:15
#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=52"
#EXTINF:15,
http://media.example.com/fileSequence52-1.ts
#EXTINF:15,
http://media.example.com/fileSequence52-2.ts
#EXTINF:15,
http://media.example.com/fileSequence52-3.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=53"
#EXTINF:15,
#EXTM3U
#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
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5"