视频传输原理解码
視頻傳輸原理
視頻是由一幅幅幀圖像和一組音頻構成的,視頻的播放過程可以簡單理解為一幀幀的畫面按照時間順序呈現(xiàn)出來的過程。但是在實際應用中,并不是每一幀都是完整的畫面,因為如果每一幀畫面都是完整的圖片,那么一個視頻的體積就會很大。這樣對于網(wǎng)絡傳輸或者視頻數(shù)據(jù)存儲來說成本太高,所以通常會對視頻流中的一部分畫面進行壓縮(編碼)處理。
編碼器將多張圖像進行編碼后生產(chǎn)成一段一段的?GOP ( Group of Pictures )?如下圖,?解碼器在播放時則是讀取一段一段的?GOP?進行解碼后讀取畫面再渲染顯示。GOP (Group of Pictures) 是一組連續(xù)的畫面,由一個 I 幀和數(shù)個 B / P 幀組成,是視頻圖像編碼器和解碼器存取的基本單位,它的排列順序將會一直重復到影像結束。
由于壓縮處理的方式不同,視頻中的畫面幀就分為了不同的類別,其中包括:I 幀、P 幀、B 幀。I 幀是內部編碼幀(也稱為關鍵幀),P 幀是前向預測幀(前向參考幀),B 幀是雙向內插幀(雙向參考幀)。簡單地講,I 幀是一個完整的畫面,而 P 幀和 B 幀記錄的是相對于 I 幀的變化。如果沒有 I 幀,P 幀和 B 幀就無法解碼。
I 幀
I 幀(Intra coded frames):I 幀圖像采用幀內編碼方式,即只利用了單幀圖像內的空間相關性,而沒有利用時間相關性。由于 I 幀不依賴其它幀,所以是隨機存取的入點,同時是解碼的基準幀。
I 幀主要用于視頻播放的初始化,I 幀圖像的壓縮倍數(shù)相對較低。I 幀圖像是周期性出現(xiàn)在圖像序列中的,出現(xiàn)頻率可由編碼器選擇。在視頻畫面播放過程中,如果 I 幀丟失了,則后面的 P 幀也就隨著解不出來,就會出現(xiàn)視頻畫面黑屏或卡頓的現(xiàn)象。
P 幀
P 幀(Predictive-coded frames)前向預測編碼圖像幀:P 幀采用幀間編碼方式,即同時利用了空間和時間上的相關性。P 幀圖像只采用前向時間預測,可以提高壓縮效率和圖像質量。P 幀是差別幀,P 幀沒有完整畫面數(shù)據(jù),只有與前一幀的畫面差別的數(shù)據(jù)。
若 P 幀丟失了,則視頻畫面會出現(xiàn)花屏、馬賽克等現(xiàn)象。
B 幀
B 幀(Bi-directional predicted frames),B 幀圖像采用雙向時間預測,可以大大提高壓縮倍數(shù)。值得注意的是,由于 B 幀圖像采用了未來幀作為參考,因此 MPEG-2 編碼碼流中圖像幀的傳輸順序和顯示順序是不同的。
這就帶來一個問題:在視頻流中,先到來的 B 幀無法立即解碼,需要等待它依賴的后面的 I、P 幀先解碼完成,這樣一來播放時間與解碼時間不一致了,順序打亂了,那這些幀該如何播放呢?這時就需要我們來了解另外兩個概念:DTS 和 PTS。
DTS 和 PTS
DTS(Decoding Time Stamp):即解碼時間戳,這個時間戳的意義在于告訴播放器該在什么時候解碼這一幀的數(shù)據(jù)。
PTS(Presentation Time Stamp):即顯示時間戳,這個時間戳用來告訴播放器該在什么時候顯示這一幀的數(shù)據(jù)。
DTS 和 PTS 都是在編碼的時候由編碼器生成的。
比如上圖的 GOP,他的采集順序是 IBBBP,那顯示順序 PTS 也是
I B B B P PTS: ? ? 12345編碼器的編碼順序是:
I P B B B DTS: ? ? 12345 PTS: ? ? 15234推流順序也是按編碼順序,即:
I P B B B DTS: ? ? 12345 PTS: ? ? 15234接收端接收的視頻流也是 IPBBB。
解碼也是按接收到的視頻流去解,接收一幀解碼一幀,解碼順序:
IPBBB
而解碼順序和顯示順序不同,我們需要按 PTS 重新調整解碼后的幀,即:
I B B B P PTS: ? ? 12345 DTS: ? ? 13452另外音頻的播放,也有 DTS、PTS 的概念,但是音頻沒有類似視頻中 B 幀,不需要雙向預測,所以音頻幀的 DTS、PTS 順序是一致的。
?
總結
- 上一篇: Python纯代码pdf批量快速转换成p
- 下一篇: [jQuery]JQuery一个对象可以