亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

音視頻流媒體文件格式剖析:M3U8篇

 

M3U8背景介紹

M3U8,用 UTF-8 編碼。"M3U" 和 "M3U8" 文件都是蘋果公司使用的 HTTP Live Streaming(HLS) 協(xié)議格式的基礎(chǔ);是 Unicode 版本的 M3U。

M3U8文件是M3U文件的一種,只不過它的編碼格式是UTF-8。M3U使用Latin-1字符集編碼。M3U的全稱是Moving Picture Experts Group Audio Layer 3 Uniform Resource Locator,即mp3 URL。M3U是純文本文件;

所以UTF-8編碼的M3U文件也簡稱為 M3U8;

HLS 是一個(gè)由蘋果公司提出的基于 HTTP 的流媒體網(wǎng)絡(luò)傳輸協(xié)議。M3U8只是它具體的表現(xiàn)形式,下面我們都稱為HLS格式。

HLS 的工作原理是把整個(gè)流分成一個(gè)個(gè)小的基于 HTTP 的文件來下載,每次只下載一些。當(dāng)媒體流正在播放時(shí),客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會(huì)話適應(yīng)不同的數(shù)據(jù)速率。在開始一個(gè)流媒體會(huì)話時(shí),客戶端會(huì)下載一個(gè)包含元數(shù)據(jù)的 extended M3U (m3u8) playlist文件,用于尋找可用的媒體流。

HLS 只請求基本的 HTTP 報(bào)文,與實(shí)時(shí)傳輸協(xié)議(RTP)不同,HLS 可以穿過任何允許 HTTP 數(shù)據(jù)通過的防火墻或者代理服務(wù)器。它也很容易使用內(nèi)容分發(fā)網(wǎng)絡(luò)來傳輸媒體流。這是HLS應(yīng)用在直播上的一大優(yōu)勢。

如果在直播中使用HLS技術(shù),那么執(zhí)行流程如下:圖片來源于蘋果官網(wǎng);

音視頻流媒體文件格式剖析:M3U8篇

 

我們播放一個(gè)HLS,首先要對HLS流對應(yīng)的M3U8文件進(jìn)行解析,解析M3U8文件,首先要搞清楚M3U8的封裝格式。

音視頻開發(fā)資料包:音視頻流媒體高級開發(fā)
FFmpegWebRTCRTMPRTSPHLSRTP播放器

M3U8格式解析

HLS流可以用于直播,也可以用于點(diǎn)播;這點(diǎn)很重要,開頭的那張圖千萬別讓你誤會(huì),M3U8是可以用作點(diǎn)播的。

M3U8 文件實(shí)質(zhì)是一個(gè)播放列表(playlist),其可能是一個(gè)媒體播放列表(Media Playlist),或者是一個(gè)主列表(Master Playlist)。

1.M3U8類型

當(dāng) M3U8 文件作為媒體播放列表(Media Playlist)時(shí),其內(nèi)部信息記錄的是一系列媒體片段資源,順序播放該片段資源,即可完整展示多媒體資源。其格式如下所示:

#EXTM3U
#EXT-X-TARGETDURATION:10

#EXTINF:9.009,
http://media.example.com/first.ts
#EXTINF:9.009,
http://media.example.com/second.ts
#EXTINF:3.003,
http://media.example.com/third.ts
#EXT-X-ENDLIST

當(dāng) M3U8 作為主播放列表(Master Playlist)時(shí),其內(nèi)部提供的是同一份媒體資源的多份流列表資源。其格式如下所示:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/low/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=240000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/lo_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=440000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/hi_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=640000,RESOLUTION=640x360,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/high/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=64000,CODECS="mp4a.40.5"
http://example.com/audio/index.m3u8
#EXT-X-ENDLIST

2.M3U8基本字段

#EXTM3U                    M3U8文件頭,必須放在第一行;
#EXT-X-MEDIA-SEQUENCE      第一個(gè)TS分片的序列號,一般情況下是0,但是在直播場景下,這個(gè)序列號標(biāo)識(shí)直播段的起始位置; #EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION      每個(gè)分片TS的最大的時(shí)長;   #EXT-X-TARGETDURATION:10     每個(gè)分片的最大時(shí)長是 10s
#EXT-X-ALLOW-CACHE         是否允許cache;          #EXT-X-ALLOW-CACHE:YES      #EXT-X-ALLOW-CACHE:NO    默認(rèn)情況下是YES
#EXT-X-ENDLIST             M3U8文件結(jié)束符;
#EXTINF                    extra info,分片TS的信息,如時(shí)長,帶寬等;一般情況下是    #EXTINF:<duration>,[<title>] 后面可以跟著其他的信息,逗號之前是當(dāng)前分片的ts時(shí)長,分片時(shí)長 移動(dòng)要小于 #EXT-X-TARGETDURATION 定義的值;
#EXT-X-VERSION             M3U8版本號
#EXT-X-DISCONTINUITY       該標(biāo)簽表明其前一個(gè)切片與下一個(gè)切片之間存在中斷。下面會(huì)詳解
#EXT-X-PLAYLIST-TYPE       表明流媒體類型;
#EXT-X-KEY                 是否加密解析,    #EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=52"    加密方式是AES-128,秘鑰需要請求   https://priv.example.com/key.php?r=52  ,請求回來存儲(chǔ)在本地;

3.如何判斷M3U8是否直播

  • 1.判斷是否存在 #EXT-X-ENDLIST

對于一個(gè)M3U8文件,如果結(jié)尾不存在 #EXT-X-ENDLIST,那么一定是 直播,不是點(diǎn)播;

  • 2.判斷 #EXT-X-PLAYLIST-TYPE 類型

'#EXT-X-PLAYLIST-TYPE' 有兩種類型,

VOD 即 Video on Demand,表示該視頻流為點(diǎn)播源,因此服務(wù)器不能更改該 M3U8 文件;

EVENT 表示該視頻流為直播源,因此服務(wù)器不能更改或刪除該文件任意部分內(nèi)容(但是可以在文件末尾添加新內(nèi)容)(注:VOD 文件通常帶有 EXT-X-ENDLIST 標(biāo)簽,因?yàn)槠錇辄c(diǎn)播片源,不會(huì)改變;而 EVEVT 文件初始化時(shí)一般不會(huì)有 EXT-X-ENDLIST 標(biāo)簽,暗示有新的文件會(huì)添加到播放列表末尾,因此也需要客戶端定時(shí)獲取該 M3U8 文件,以獲取新的媒體片段資源,直到訪問到 EXT-X-ENDLIST 標(biāo)簽才停止)。

4.M3U8多碼率

上面的Master Playlist 就是會(huì)提供 多碼率的列表資源,如下:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/low/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=240000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/lo_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=440000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/hi_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=640000,RESOLUTION=640x360,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/high/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=64000,CODECS="mp4a.40.5"
http://example.com/audio/index.m3u8
#EXT-X-ENDLIST

'#EXT-X-STREAM-INF' 字段后面有:

BANDWIDTH 指定碼率

RESOLUTION 分辨率

PROGRAM-ID 唯一ID

CODECS 指定流的編碼類型

碼率、碼流是同一個(gè)概念,是數(shù)據(jù)傳輸時(shí)單位時(shí)間傳送的數(shù)據(jù)量,一般用單位kbps表示。

視頻碼率就是指視頻文件在單位時(shí)間內(nèi)使用的數(shù)據(jù)量。簡單理解就是要播放一秒的視頻需要多少數(shù)據(jù),從這個(gè)角度就不難理解通常碼率越高視頻質(zhì)量也越好,相應(yīng)的文件體積也會(huì)越大。碼率、視頻質(zhì)量、文件體積是正相關(guān)的。但當(dāng)碼率超過一定數(shù)值后,對圖像的質(zhì)量影響就不大了。幾乎所有的編碼算法都在追求用最低的碼率達(dá)到最少的失真(最好的清晰度)。

5.如何在M3U8中插入廣告

M3U8文件中插入廣告,要想靈活的控制廣告,則廣告可以插入任何視頻中,那么無法保證廣告的編碼格式和碼率等信息和原視頻的編碼格式等信息保持一致,就必須告知播放器,在插入廣告的地方,ts片段發(fā)生的信息變更,需要播放器適配處理。

'#EXT-X-DISCONTINUITY' 該標(biāo)簽表明其前一個(gè)切片與下一個(gè)切片之間存在中斷。說明有不連續(xù)的視頻出現(xiàn),這個(gè)視頻絕大多數(shù)情況下就是廣告; '#EXT-X-DISCONTINUITY' 這個(gè)字段就是來做這個(gè)事情的;

下面展示一個(gè)插入廣告的例子:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
movieA.ts
#EXTINF:10.0,
movieB.ts
 ...
#EXT-X-ENDLIST

想在開頭插入廣告:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
ad0.ts
#EXTINF:8.0,
ad1.ts
#EXT-X-DISCONTINUITY
#EXTINF:10.0,
movieA.ts
#EXTINF:10.0,
movieB.ts
...
#EXT-X-ENDLIST

當(dāng)然你可以在任意位置插入廣告。

HLS協(xié)議草案:HLS協(xié)議中還有很多字段,但是有些字段其實(shí)就是協(xié)議,在實(shí)際應(yīng)用中并不大;大家可以參考看看;
https://tools.ietf.org/html/rfc8216

M3U8實(shí)戰(zhàn)

將一個(gè)mp4視頻轉(zhuǎn)化為m3u8視頻:

ffmpeg -re -i test.mp4 -c copy -f hls -bsf:v h264_mp4toannexb test.m3u8
音視頻流媒體文件格式剖析:M3U8篇

 

生成了一個(gè)m3u8和很多ts分片:

音視頻流媒體文件格式剖析:M3U8篇

 

但是生成的test.m3u8發(fā)現(xiàn)了問題,如下,才有5個(gè)分片。這是因?yàn)閒fmpeg 默認(rèn)的list size 為5,所以只獲得最后的5個(gè)片段。

音視頻流媒體文件格式剖析:M3U8篇

 

要想解決這個(gè)問題,需要指定參數(shù)-hls_list_size 0,這樣就能包含所有的片段。加上 -hls_list_size 0

ffmpeg -re -i test.mp4 -c copy -f hls -hls_list_size 0  -bsf:v h264_mp4toannexb test.m3u8

為什么還要加上參數(shù)-bsf:v h264_mp4toannexb ?

這個(gè)參數(shù)的作用是將MP4中的H.264數(shù)據(jù)轉(zhuǎn)換成為H.264 AnnexB標(biāo)準(zhǔn)的編碼,AnnexB標(biāo)準(zhǔn)的編碼常見于實(shí)時(shí)傳輸流中。如果源文件為FLV、TS等可以作為直播傳輸流的視頻,則不需要這個(gè)參數(shù)。

這也非常強(qiáng)烈地說明了MP4不是流式文件,不能作為直播使用。

學(xué)習(xí)思考

1.視頻廣告

目前M3U8視頻占我們線上視頻的比例是近60%,量非常大,我們可以在M3U8視頻中任意位置插入一些廣告,為探索商業(yè)化開辟新的路。

2.為什么M3U8中分片使用TS不用MP4

這是因?yàn)閮蓚€(gè) TS 片段可以無縫拼接,播放器能連續(xù)播放,而 MP4 文件由于編碼方式的原因,兩段 MP4 不能無縫拼接,播放器連續(xù)播放兩個(gè) MP4 文件會(huì)出現(xiàn)破音和畫面間斷,影響用戶體驗(yàn)。而且如果要在一段長達(dá)一小時(shí)的視頻中跳轉(zhuǎn),如果使用單個(gè) MP4 格式的視頻文件,如果也用 HTTP 協(xié)議,那么需要代理服務(wù)器支持 HTTP range request 獲取大文件中的一部分。這樣的話,對于代理服務(wù)器的性能來說要求較高。而 HTTP Live Streaming 則只需要根據(jù)列表文件中的時(shí)間軸找出對應(yīng)的 TS 片段下載即可,不需要 range request,對代理服務(wù)器的要求小很多。所有代理服務(wù)器都支持小文件的高效緩存。

分享到:
標(biāo)簽:M3U8
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定