視頻轉(zhuǎn)碼 video transcoding:是指將一個視頻碼流轉(zhuǎn)換另一個視頻碼流,以適應(yīng)不同的網(wǎng)絡(luò)帶寬程储,不同的終端處理能力和不同的客戶需求臂寝。點播系統(tǒng)中的轉(zhuǎn)碼一般是離線轉(zhuǎn)碼摊灭,直播系統(tǒng)中的轉(zhuǎn)碼為即時轉(zhuǎn)碼咆贬。
終端適配:將特定格式的視頻轉(zhuǎn)換成終端適配能力較高的視頻帚呼,以便在最廣泛的終端上實現(xiàn)分發(fā)。例如眷蜈,將AVI格式(對網(wǎng)絡(luò)播放支持不友好)的視頻轉(zhuǎn)碼成MP4(幾乎所有網(wǎng)絡(luò)播放器都支持)沈自,以便在互聯(lián)網(wǎng)上進行分發(fā);
帶寬適配:將視頻轉(zhuǎn)碼為超清枯途、高清、標(biāo)清等多路不同碼率的視頻榴啸,以便不同網(wǎng)絡(luò)帶寬的用戶選擇不同碼率的視頻晚岭;
播放友好:優(yōu)化視頻封裝格式,以實現(xiàn)更好地播放效果坦报;例如,某些MP4文件的MOOV頭可能位于尾部,導(dǎo)致部分播放器需要下載整個MP4文件之后才能開始播放;可以通過轉(zhuǎn)碼將MOOV頭調(diào)整到文件頭部畔濒,以便播放器無需下載整個文件便可以開始播放辫愉;
增加水印:在視頻中增加版權(quán)相關(guān)圖片(例如電視臺的臺標(biāo))胸懈,宣示視頻本身的版權(quán)歸屬阐肤;
降低分發(fā)帶寬:使用更先進的編碼方式對視頻進行編碼浑塞,確保在不降低畫質(zhì)的前提下降低視頻碼率政己,從而達到節(jié)省帶寬的目的;例如對原本使用H.264編碼的視頻進行H.265編碼歇由;
降低存儲成本:對于以歸檔、備案為目的的視頻糊昙,直接存儲原始視頻可能會帶來較高的存儲成本谢谦,此時可以將視頻轉(zhuǎn)為低碼率進行存儲,從而大幅降低視頻存儲成本回挽。
HLS:HTTP Live Streaming,是由蘋果公司提出的基于HTT的流媒體網(wǎng)絡(luò)傳輸協(xié)議祭刚。他的工作原理是把整個流分成一個個小的基于HTTP的文件來下載队塘,每次只下載一些。當(dāng)媒體流正在播放時憔古,客戶端可以選擇從愈多不同的備用源中以不同的速率下載同樣的資源,允許流媒體繪畫適應(yīng)不同的數(shù)據(jù)速率锯梁。在開始一個流媒體會話時焰情,客戶端會下載一個包含源數(shù)據(jù)的extended M3U(m3u8)playlist文件陌凳,用于尋找可用的媒體流。
HLS協(xié)議規(guī)定:
視頻的封裝格式是TS合敦。
視頻的編碼格式為H264,音頻編碼格式為MP3验游、AAC或者AC-3保檐。
除了TS視頻文件本身崔梗,還定義了用來控制播放的m3u8文件(文本文件)。
把視頻文件上傳到服務(wù)器上扔亥,視頻會被轉(zhuǎn)換成HLS格式的視頻(即TS和m3u8文件)谈为。Media encoder模塊負(fù)責(zé)將視頻源中的視頻數(shù)據(jù)轉(zhuǎn)碼到目標(biāo)編碼格式(H264)的視頻數(shù)據(jù),然后Stream Segment模塊將視頻切片伞鲫,切片的結(jié)果就是index file(m3u8)和ts文件了。
HLS的index文件就是m3u8的文件,先下載一級index file(master_playlist.m3u8)瘪菌,它里面記錄了二級索引文件的地址(Alternate-A、Alternate-B诵肛、Alternate-C)的地址默穴,然后客戶端再去下載二級索引文件,二級索引文件中又記錄了TS文件的下載地址蓄诽,這樣客戶端就可以按順序下載TS視頻文件并連續(xù)播放。
master_playlist.m3u8:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=354986,RESOLUTION=320x180? ? //視頻流的比特率和分辨率
v.f210.m3u8? ? //二級index文件的路徑乙埃,可以是相對路徑锯岖,也可以是絕對路徑
#EXT-X-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=633293,RESOLUTION=640x360
v.f220.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=1198319,RESOLUTION=1280x720
v.f230.m3u8
master_playlist.m3u8文件中記錄了不同比特率視頻流的二級index文件路徑,客戶端可以自己判斷自己的現(xiàn)行網(wǎng)絡(luò)帶寬出吹,來決定播放哪一個視頻流。也可以在網(wǎng)絡(luò)帶寬變化的時候平滑切換到和帶寬匹配的視頻流鸠珠。
#EXTM3U? ?//每個M3U文件第一行必須是這個tag,提供標(biāo)示作用
#EXT-X-VERSION:3? ?//用以標(biāo)示協(xié)議版本跳芳。這里是3, 那么這里用的就是HLS協(xié)議第三個版本娄琉,此標(biāo)簽只能有0或1個吓歇,不寫代表使用版本1
#EXT-X-TARGETDURATION:17? //EXT-X-TARGETDURATION指定當(dāng)前視頻流中的切片文件的最大時長,也就是說這些ts切片的時長不能大于#EXT-X-TARGETDURATION的值城看。
#EXT-X-MEDIA-SEQUENCE:0 //切片的開始序號。每一個切片都有唯一的序號炼鞠,相鄰之間序號+1轰胁。這個編號會繼續(xù)增長,保證流的連續(xù)性赃阀。
#EXT-X-KEY:METHOD=AES-128, //HLS可以被加密」塾危客戶端通過讀取M3U8文件中的#EXT-X_KEY標(biāo)簽可以獲取解密的密鑰驮俗。EXT-X-KEY指示的密鑰信息作用于當(dāng)前EXT-X-KEY標(biāo)簽至下一個EXT-X-KEY標(biāo)簽(若沒有下一個,則到最后一個Segment)之間的所有Segments意述。METHOD指示加密算法,可用的取值有NONE拌屏、AES-128和SAMPLE-AES术荤,NONE表示不加密倚喂。URI指示獲取密鑰的路徑,該項不可省略焦读,除非METHOD為NONE舱权。
#EXTINF:2.000000,? ?//EXTINF表示每個ts切片視頻文件的時長
v.f230.ts?start=0&end=204735&type=mpegts //ts文件的下載地址,這里同樣使用了相對路徑宴倍。
...
#EXT-X-ENDLIST? ? ?//EXT-X-ENDLIST這個表示視頻結(jié)束,有這個標(biāo)志同時也說明當(dāng)前的流是一個非直播流俗他。
播放模式
點播VOD的特點就是當(dāng)前時間點可以獲取到所有index文件和ts文件阔逼,二級index文件中記錄了所有ts文件的地址。這種模式允許客戶端訪問全部內(nèi)容嗜浮。上面的例子中就是一個點播模式下的m3u8的結(jié)構(gòu)。
Live模式就是實時生成M3u8和ts文件夕春。它的索引文件一直處于動態(tài)變化的专挪,播放的時候需要不斷下載二級index文件片排,以獲得最新生成的ts文件播放視頻。如果一個二級index文件的末尾沒有#EXT-X-ENDLIST標(biāo)志率寡,說明它是一個Live視頻流。