網絡直播電視之M3U8解析篇 -开发者知识库

網絡直播電視之M3U8解析篇 -开发者知识库,第1张

原文
最近單位要進行網絡直播電視的開發工作,基本上在網上找不到相應的資料。但現在網絡直播做出來了,做簡要的講解希望能給后來開發者提供一定的幫助。自己寫的測試工具如下:

- 不論是點播還是直播,重要的部分不外乎都是數據源和數據播放兩個方面。對於播放沒什么特殊性,現在我針對直播的特殊地方,M3U8的解析進行說明。僅僅是個人見解。有不足的地方,望各位大牛們指出。
- 我們通過CCTV-3的網絡直播地址進行分析http://t.live.cntv.cn/m3u8/cctv-3.m3u8。通過上個地址可以獲得如下的內容:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=500000 http://ipad.vsdn.tv380.com/5B63686E5D445830303030303034367C313635367C317C313030307C434354562D337C687474707C74735B2F63686E5D5B74735D307C687474705B2F74735DVSDNSOOONERCOM00/cctv3.m3u8

其中EXT-X-STREAM-INF字段,說明了關於所屬下載地址的相關信息。當然有些字段需要,有些字段不需要,重點看你的具體需求。而我主要利用了BANDWIDTH,一般我會取其中最高的一個。例如CCTV5中就包含了兩個下載地址:

#EXTM3U  
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=500000 http://ipad.vsdn.tv380.com/5B63686E5D445830303030303034367C313735397C317C313030307C434354562D357C687474707C74735B2F63686E5D5B74735D307C687474705B2F74735DVSDNSOOONERCOM00/cctv5.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=64000 http://220.181.168.111:80/interface/ipad/vid/63/ipad.m3u8

接下來我們通過CCTV3中提供的數據鏈接獲取地址為例。
http://ipad.vsdn.tv380.com/5B63686E5D445830303030303034367C313635367C317C313030307C434354562D337C687474707C74735B2F63686E5D5B74735D307C687474705B2F74735DVSDNSOOONERCOM00/cctv3.m3u8,獲取到一下內容:(郁悶了,得不到下一級內容了。數據都在單位內,只能用網上能找到的鏈接地址了。改天有時間再行替換。)

#EXTM3U  
#EXT-X-MEDIA-SEQUENCE:1356094361
#EXT-X-TARGETDURATION:10
#EXTINF:10,
cctv3_00_20121221201800.ts
#EXTINF:11,
cctv3_00_20121221201810.ts
#EXTINF:10,
cctv3_00_20121221201820.ts

其中#EXTINF:10, cctv3_00_20121221201800.ts,標記了一個TS下載片段和時長。我們還需注意就是#EXT-X-MEDIA-SEQUENCE:1356094361,這個字段標記了此M3U8下載的片段的序號。以上為了分別是1356094361,1356094362, 1356094363,相應序號。為了防止出現記錄下載列表出現片段沖突的情況,最好在數據結構里定義序列號。我們通過頻繁的刷新http://ipad.vsdn.tv380.com/5B63686E5D445830303030303034367C313635367C317C313030307C434354562D337C687474707C74735B2F63686E5D5B74735D307C687474705B2F74735DVSDNSOOONERCOM00/cctv3.m3u8片可以不間斷的獲取到實時TS片段的下載地址,並不斷的將其存放在隊列中。
注意以下下幾點問題:
1. 不要將片段在隊列中沖突了。
2. 一定要將#EXT-X-STREAM-INF字段進行解析過程和片段解析過程放到一起,因為有時服務器會突然更換下載片段M3U8地址。
3. 注意一次m3u8獲取到的片段個數,從而得到一次獲取到的總的播放時長。進而安排好程序下次刷新的時間間隔。
4. 一定要設定下載的超時時間,不能無限等待。拿不到的片段,果斷丟棄。
5. 片段序號總有一個時間點上會被歸為0或1(不同的源不一樣),提前處理做好准備。
我遇見到的不同數據源的M3U8文件進行列舉和分析。
第一種:ts片段地址為文件名稱,下載地址為:

http:\\www.XXX.com\01\XX\1.m3u8

#EXTM3U
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:92595
#EXTINF:8,
20121120T182851-04-92595.ts
#EXTINF:8,
20121120T182851-04-92596.ts
#EXTINF:8,
20121120T182851-04-92597.ts
#EXTINF:8,
20121120T182851-04-92598.ts
#EXTINF:8,
20121120T182851-04-92599.ts
#EXTINF:8,
20121120T182851-04-92600.ts
#EXTINF:8,
20121120T182851-04-92601.ts
#EXTINF:8,
20121120T182851-04-92602.ts

那么獲取到 20121120T182851-04-92595.ts 片段地址就為
http:\www.XXX.com\01\XX\20121120T182851-04-92595.ts。
類似情況,如下:

#EXTM3U 
#EXT-X-ALLOW-CACHE:NO

#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:6198
#EXTINF:3, aac749f7425bf07f_13b4b0fd1b7_6198.ts?wsApp=HLS&wsMonitor=-1&wsHost=rtmp.cntv.lxdns.com
#EXTINF:3, aac749f7425bf07f_13b4b0fe1b8_6199.ts?wsApp=HLS&wsMonitor=-1&wsHost=rtmp.cntv.lxdns.com #EXTINF:3, aac749f7425bf07f_13b4b0ffa08_6200.ts?wsApp=HLS&wsMonitor=-1&wsHost=rtmp.cntv.lxdns.com

第二種:ts片段地址為目錄結構,下載地址為:

http:\\www.XXX.com\01\XX\1.m3u8。

#EXTM3U
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:9190381
#EXTINF:10,
/timeshift/63/20121129165010.ts
#EXTINF:10,
/timeshift/63/20121129165020.ts
#EXTINF:10,
/timeshift/63/20121129165030.ts

那么獲取到/timeshift/63/20121129165010.ts片段地址就為
http:\www.XXX.com\01\XX/timeshift/63/20121129165010.ts。

第三種:ts片段地址為目錄結構,但是和m3u8下載地址目錄重疊。下載地址為:http:\www.XXX.com\01\timeshift\63\1.m3u8。

#EXTM3U  
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:9190381
#EXTINF:10,
/timeshift/63/20121129165010.ts
#EXTINF:10,
/timeshift/63/20121129165020.ts
#EXTINF:10,
/timeshift/63/20121129165030.ts

將沖突的目錄剔除,那么獲取到/timeshift/63/20121129165010.ts片段地址就為http:\www.XXX.com\01\XX/timeshift/63/20121129165010.ts。

第四種:ts片段地址為完整的片段下載地址,下載地址為:

http:\\www.XXX.com\01\XX\1.m3u8

#EXTM3U
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:6297202
#EXTINF:10,
http://202.108.17.170:80/ipad/160_12784_1758/20121127185340.ts?userid=2221281760225887_160_12784_1758
#EXTINF:10,
http://202.108.17.170:80/ipad/160_12784_1758/20121127185350.ts?userid=2221281760225887_160_12784_1758
#EXTINF:10,
http://202.108.17.170:80/ipad/160_12784_1758/20121127185400.ts?userid=2221281760225887_160_12784_1758

這種情況下下載地址就不需要拼接了。
直播不同的數據得到的片段下載地址也就基本維持這四種情況,當然林子大了什么鳥都有。也說不定會碰見更奇特的呢。呵呵…

總結:
1. http”開頭的一定是全下載地址,不需要進行拼接處理的。有些“二桿子源”,會將寫成“HTTP”或“Http”等等。所以我們需要先轉成小寫在進行匹配,當然下載地址的http還需為小寫。
2. 帶有目錄結構的源,同樣有些或是這樣的“timeshift/63/2012129165020.ts”,前面不帶“/”。注意哦!

最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复