1.
WAV編碼:PCM(脈沖編碼調制)是Pulse Code Modulation的縮寫。前面已經介紹過PCM大致的工作流程,而WAV編碼的一種實現(有多種實現方式,但是都不會進行壓縮操作)就是在PCM數據格式的前面加上44字節,分別用來描述PCM的采樣率、聲道數、數據格式等信息。WAV格式的文件稱為無壓縮的格式,對於WAV格式音頻文件,ffplay肯定可以直接播放,但是若讓ffplay播放PCM裸數據的話,只要為其提供上述三個主要的信息,那么它就可以正確地播放了。
音頻的原始數據格式PCM,視頻的原始數據格式(YUV420P或者rgba)。
播放YUV420P格式的視頻幀:
ffplay -f rawvideo -pixel_format yuv420p -s 480*480 texture.yuv
播放rgb的原始數據:
ffplay -f rawvideo -pixel_format rgb24 -s 480*480 texture.rgb
2.
后來人們通過實驗證明,紅綠藍三種色光無法被分解,故稱為三原色光,等量的三原色光相加會變為白光,即白光中含有等量的紅光(R)、綠光(G)、藍光(B)。
3.
與RGB視頻信號傳輸相比,YUV最大的優點在於只需要占用極少的頻寬(RGB要求三個獨立的視頻信號同時傳輸)。其中“Y”表示明亮度(Luminance或Luma),也稱灰階值;而“U”和“V”表示的則是色度(Chrominance或Chroma),它們的作用是描述影像的色彩及飽和度,用於指定像素的顏色。“亮度”是透過RGB輸入信號來建立的,方法是將RGB信號的特定部分疊加到一起。“色度”則定義了顏色的兩個方面——色調與飽和度,分別用Cr和Cb來表示。其中,Cr反映了RGB輸入信號紅色部分與RGB信號亮度值之間的差異,而Cb反映的則是RGB輸入信號藍色部分與RGB信號亮度值之間的差異。
4.
彩色電視采用YUV空間正是為了用亮度信號Y解決彩色電視機與黑白電視機的兼容問題,使黑白電視機也能接收彩色電視信號,最常用的表示形式是Y、U、V都使用8個字節來表示,所以取值范圍就是0~255。在廣播電視系統中不傳輸很低和很高的數值,實際上是為了防止信號變動造成過載,因而把這“兩邊”的數值作為“保護帶”,不論是Rec.601還是BT.709的廣播電視標准中,Y的取值范圍都是16~235,UV的取值范圍都是16~240。
5.視頻編碼標准
還記得前面提到過的圖像編碼標准JPEG嗎?對於視頻,ISO同樣也制定了標准:Motion JPEG即MPEG,MPEG算法是適用於動態視頻的壓縮算法,它除了對單幅圖像進行編碼外,還利用圖像序列中的相關原則去除冗余,這樣可以大大提高視頻的壓縮比。截至目前,MPEG的版本一直在不斷更新中,主要包括這樣幾個版本:Mpeg1(用於VCD)、Mpeg2(用於DVD)、Mpeg4 AVC(現在流媒體使用最多的就是它了)。
相比較於ISO制定的MPEG的視頻壓縮標准,ITU-T制定的H.264視頻編碼標准創造了多參考幀、多塊類型、整數變換、幀內預測等新的壓縮技術,使用了更精細的分像素運動矢量(1/4、1/8)和新一代的環路濾波器,這使得壓縮性能得到大大提高。
6.編碼概念
1.IPB幀
視頻壓縮中,每幀都代表着一幅靜止的圖像。而在進行實際壓縮
時,會采取各種算法以減少數據的容量,其中IPB幀就是最常見的一
種。
·I幀:幀內編碼幀(intra picture),I幀通常是每個GOP(MPEG所
使用的一種視頻壓縮技術)的第一個幀,經過適度地壓縮,作為隨機訪
問的參考點,可以當成靜態圖像。I幀可以看作一個圖像經過壓縮后的
產物,I幀壓縮可以得到6:1的壓縮比而不會產生任何可覺察的模糊現
象。I幀壓縮可去掉視頻的空間冗余信息,下面即將介紹的P幀和B幀是
為了去掉時間冗余信息。
·P幀:前向預測編碼幀(predictive-frame),通過將圖像序列中前
面已編碼幀的時間冗余信息充分去除來壓縮傳輸數據量的編碼圖像,也
稱為預測幀。
·B幀:雙向預測內插編碼幀(bi-directional interpolated prediction
frame),既考慮源圖像序列前面的已編碼幀,又顧及源圖像序列后面
的已編碼幀之間的時間冗余信息,來壓縮傳輸數據量的編碼圖像,也稱
為雙向預測幀。
基於上面的定義,我們可以從解碼的角度來理解IPB幀。
·I幀自身可以通過視頻解壓算法解壓成一張單獨的完整視頻畫面,
所以I幀去掉的是視頻幀在空間維度上的冗余信息。
·P幀需要參考其前面的一個I幀或者P幀來解碼成一張完整的視頻畫
面。
·B幀則需要參考其前一個I幀或者P幀及其后面的一個P幀來生成一
張完整的視頻畫面,所以P幀與B幀去掉的是視頻幀在時間維度上的冗
余信息。
IDR幀與I幀的理解
在H264的概念中有一個幀稱為IDR幀,那么IDR幀與I幀的區別是什
么呢?首先來看一下IDR的英文全稱instantaneous decoding refresh
picture,因為H264采用了多幀預測,所以I幀之后的P幀有可能會參考I
幀之前的幀,這就使得在隨機訪問的時候不能以找到I幀作為參考條
件,因為即使找到I幀,I幀之后的幀還是有可能解析不出來,而IDR幀
就是一種特殊的I幀,即這一幀之后的所有參考幀只會參考到這個IDR
幀,而不會再參考前面的幀。在解碼器中,一旦收到一個IDR幀,就會
立即清理參考幀緩沖區,並將IDR幀作為被參考的幀。
2.PTS(解碼時間戳)與DTS(顯示時間戳)
DTS主要用於視頻的解碼,英文全稱是Decoding Time Stamp,PTS
主要用於在解碼階段進行視頻的同步和輸出,全稱是Presentation Time
Stamp。在沒有B幀的情況下,DTS和PTS的輸出順序是一樣的。因為B
幀打亂了解碼和顯示的順序,所以一旦存在B幀,PTS與DTS勢必就會
不同,本書后邊的章節里會詳細講解如何結合硬件編碼器來重新設置
PTS和DTS的值,以便將硬件編碼器和FFmpeg結合起來使用。這里先簡
單介紹一下FFmpeg中使用的PTS和DTS的概念,FFmpeg中使用
AVPacket結構體來描述解碼前或編碼后的壓縮數據,用AVFrame結構體
來描述解碼后或編碼前的原始數據。對於視頻來說,AVFrame就是視頻
的一幀圖像,這幀圖像什么時候顯示給用戶,取決於它的PTS。DTS是
AVPacket里的一個成員,表示該壓縮包應該在什么時候被解碼,如果視
頻里各幀的編碼是按輸入順序(顯示順序)依次進行的,那么解碼和顯
示時間應該是一致的,但是事實上,在大多數編解碼標准(如H.264或
HEVC)中,編碼順序和輸入順序並不一致,於是才會需要PTS和DTS
這兩種不同的時間戳。