DTV 学习(二) 数字视频
視頻簡單地說就是活動的圖像。保存和描述數字視頻的簡單方法就是記錄和描述連續的一幀幀的靜止圖像。保存靜止圖像的最簡單格式是BMP格式,就是位圖。BMP是未經壓縮的原始圖像保存格式,采用RGB描述。數字視頻流則采用YUV描述。所以播放視頻時,要將YUV格式的數據轉換成RGB格式顯示。至于YUV與RGB如何相互裝換,這里不詳細介紹,網上有一大堆資料。
一、視頻壓縮
MPEG視頻壓縮編碼后包括三種元素:
I幀(I-frames):幀內壓縮編碼形成的圖像
P幀(P-frames):前向預測幀,以一個P 幀或 I 幀為預測幀進行編碼
B幀(B-frames):從相鄰(前后均可)的最近的I 幀或 P 幀作雙向預測進行編碼
?
?
在MPEG編碼的過程中,部分視頻幀序列壓縮成為I幀;部分壓縮成P幀;還有部分壓縮成B幀。I幀法是幀內壓縮法,也稱為“關鍵幀”壓縮法。I幀法是基于離散余弦變換DCT( Discrete Cosine Transform )的壓縮技術,這種算法與JPEG壓縮算法類似。JPEG壓縮是一種針對靜止的連續色調的圖像壓縮方法,它屬于帖內壓縮。采用I幀壓縮可達到1/6的壓縮比而無明顯的壓縮痕跡。
??? ?MPEG標準采用YCbCr(YUV)4::2:2的采樣格式,其含義為:每個點保存一個 8bit 的亮度值(也就是Y值),每2個點保存一個 Cr(8bit) 和Cb(8bit) 值, 圖像在肉眼中的感覺不會起太大的變化。其編碼的基本方法是在單位時間內,首先采集并壓縮第一幀的圖像為I幀。然后對于其后的各幀,在對單幀圖像進行有效壓縮的基礎上,只存儲其相對于前后幀發生變化的部分。幀間壓縮的過程中也常間隔采用幀內壓縮法,由于幀內(關鍵幀)的壓縮不基于前一幀,一般每隔15幀設一關鍵幀,這樣可以減少相關前一幀壓縮的誤差積累。MPEG編碼器首先要決定壓縮當前幀為I幀或P幀或B幀,然后采用相應的算法對其進行壓縮。一個視頻序列經MPEG全編碼壓縮后可能的格式為:IBBPBBPBBPBBPBBIBBPBBP BBPBBPBBI......
下面說明I幀、P幀以及B幀的特點:
1.I幀:幀內編碼幀 
I幀特點: 
①它是一個全幀壓縮編碼幀。它將全幀圖像信息進行JPEG壓縮編碼及傳輸。 
②解碼時僅用I幀的數據就可重構完整圖像。 
③I幀描述了圖像背景和運動主體的詳情。 
④I幀不需要參考其他畫面而生成。 
⑤I幀是P幀和B幀的參考幀(其質量直接影響到同組中以后各幀的質量)。 
⑥I幀是幀組GOP的基礎幀(第一幀),在一組中只有一個I幀。 
⑦I幀不需要考慮運動矢量。 
⑧I幀所占數據的信息量比較大。 
2. P幀:前向預測編碼幀。 
(1)P幀的預測與重構:P幀是以I幀為參考幀,在I幀中找出P幀“某點”的預測值和運動矢量,取預測差值(對其進行類似JPEG壓縮編碼)和運動矢量(Huffman編碼)一起傳送。在接收端根據運動矢量從I幀中找出P幀“某點”的預測值并與差值相加以得到P幀“某點”樣值,從而可得到完整的P幀。 
(2)P幀特點 
①P幀是I幀后面相隔1~2幀的編碼幀。 
②P幀采用運動補償的方法傳送它與前面的I或P幀的差值及運動矢量(預測誤差)。 
③解碼時必須將I幀中的預測值與預測誤差求和后才能重構完整的P幀圖像。 
④P幀屬于前向預測的幀間編碼。它只參考前面最靠近它的I幀或P幀。 
⑤P幀可以是其后面P幀的參考幀,也可以是其前后的B幀的參考幀。 
⑥由于P幀是參考幀,它可能造成解碼錯誤的擴散。 
⑦由于是差值傳送,P幀的壓縮比較高。 
3.B幀:雙向預測內插編碼幀。 
(1)B幀的預測與重構 
B幀以前面的I或P幀和后面的P幀為參考幀,“找出”B幀“某點”的預測值和兩個運動矢量,并取預測差值和運動矢量傳送。接收端根據運動矢量在兩個參考幀中“找出(算出)”預測值并與差值求和,得到B幀“某點”樣值,從而可得到完整的B幀(不知如何算出)。 
2)B幀特點 
①B幀是由前面的I或P幀和后面的P幀來進行預測的。 
②B幀傳送的是它與前面的I或P幀和后面的P幀之間的預測誤差及運動矢量。 
③B幀是雙向預測編碼幀。 
④B幀壓縮比最高,因為它只反映丙參考幀間運動主體的變化情況,預測比較準確。 
⑤B幀不是參考幀,不會造成解碼錯誤的擴散。 
注:I、B、P各幀是根據壓縮算法的需要,是人為定義的,它們都是實實在在的物理幀,至于圖像中的哪一幀是I幀,是隨機的,一但確定了I幀,以后的各幀就嚴格按規定順序排列。
二、視頻編碼
上圖為視頻壓縮編碼的簡單流程。I幀編碼對象是整個幀內數據,P、B幀編碼的對象是預測差值和運動向量,對差值采用JPEG編碼方式,對運動向量可以簡單地用Huffman編碼。P、B編碼方式與I幀編碼方式大同小異,下面以I幀編碼為例詳細說明之。
I幀采用的是JPEG編碼方式,JPEG編碼集合DPCM編碼、RLE編碼(行程編碼)、熵編碼(Huffman)等編碼方式一體,所以JPEG有很高的壓縮比。
JPEG編碼的流程為:
?
根據 3 種相互間有預測與生成關系的不同的幀數據,I P B 按不同的組合組成像組 GOP,并加上序列起始碼和序列頭等數據組成圖像序列或基本碼流(ES),ES 再打包成PES,PES 再按 188B 的固定長度加上各種參數組成傳送碼流 TS,如下圖所示: 下圖是基于 MPEG-2 標準的視頻壓縮編碼的直觀圖示: 對于PES 結構,最重要的部分是解碼時間標記 DTS(Decode Time Stamp)和播出時間標記PTS(Presentation Time Stamp),有了 DTS 和 PTS,解碼器就可以從編碼器傳送的 I/B/P幀中重建視頻流,即 DTS 告訴解碼器何時解碼幀,而 PTS 告訴解碼器何時顯示幀 在 MPEG-2 標準中,有兩種不同類型的碼流輸出到信道,一種是節目碼流PS(Program Stream),適于沒有誤差產生的媒體存儲(如DVD),另一種是傳輸流(TS:Transport Stream),適于有信道噪聲產生的傳輸,可在兩網絡中做遠距離傳送,這樣的 TS 便于綜合多路節目為單路節目即復用。 MPEG-2 系統層協議規范 為了實現解碼同步,在非定長的打包的原始流(PES:Packetized Elementary Stream)中插入播出時間標記(PTS:Presentation Time Stamp)和解碼時間標記(DTS:Decoding Time Stamp)以及相關的系列標識符。 由上圖可見,TS 包由 4B 的包頭、可變長度的調整頭和凈荷構成。包頭由同步字節、1b 傳送數據包差錯提示、1b 凈荷單元起始提示、1b 傳送優先權、13b 包字符標識 PID,2b 傳送加擾控制,2b 調整字段控制和 4b 連續計數器組成。 MEPG-2 傳送流包語法結構 188B 長度的 TS 包由 4B 的包頭、可變長字節的調整字段(Adaptation Field)以及有效數據凈荷組成,這些信息與傳送系統有關,而 TS 包中凈荷所傳送的信息主要包括 4 種類型: (1)視頻、音頻的 PES 包以及輔助數據 (2)描述單路節目信息的節目映射表(PMT)與描述多路節目復用信息的節目關聯表(PAT)以及對CA 系統所要求的條件訪問表(CAT) (3)各種業務信息表 (4)DVB 數據廣播信息?
8×8的圖象經過DCT變換后,其低頻分量都集中在左上角,高頻分量分布在右下角(DCT變換實際上是空間域的低通濾波器)。由于該低頻分量包含了圖象的主要信息(如亮度),而高頻與之相比,就不那么重要了,所以我們可以忽略高頻分量,從而達到壓縮的目的。如何將高頻分量去掉,這就要用到量化,它是產生信息損失的根源。這里的量化操作,就是將某一個值除以量化表中對應的值。由于量化表左上角的值較小,右上角的值較大,這樣就起到了保持低頻分量,抑制高頻分量的目的。JPEG使用的顏色是YUV格式。Y分量代表了亮度信息,UV分量代表了色差信息。相比而言,Y分量更重要一些。我們可以對Y采用細量化,對UV采用粗量化,可進一步提高壓縮比。所以上面所說的量化表通常有兩張,一張是針對Y的;一張是針對UV的。
??? 上面講了,經過DCT變換后,低頻分量集中在左上角,其中F(0,0)(即第一行第一列元素)代表了直流(DC)系數,即8×8子塊的平均值,要對它單獨編碼。由于兩個相鄰的8×8子塊的DC系數相差很小,所以對它們采用差分編碼DPCM,可以提高壓縮比,也就是說對相鄰的子塊DC系數的差值進行編碼。8×8的其它63個元素是交流(AC)系數,采用行程編碼。這里出現一個問題:這63個系數應該按照怎么樣的順序排列?為了保證低頻分量先出現,高頻分量后出現,以增加行程中連續“0”的個數,這63個元素采用了“之”字型(Zig-Zag)的排列方法,如下圖所示。
?
?Zig-Zag 這63個AC系數行程編碼的碼字用兩個字節表示,如下圖所示。
?
?行程編碼
上面,我們得到了DC碼字和 AC行程碼字。為了進一步提高壓縮比,需要對其再進行熵編碼,這里選用Huffman編碼,分成兩步:
(1)熵編碼的中間格式表示
對于AC系數,有兩個符號。符號1為行程和尺寸,即上面的(RunLength,Size)。(0,0)和(15,0)是兩個比較特殊的情況。(0,0)表示塊結束標志(EOB),(15,0)表示ZRL,當行程長度超過15時,用增加ZRL的個數來解決,所以最多有三個ZRL(3×16+15=63)。符號2為幅度值(Amplitude)。
對于DC系數,也有兩個符號。符號1為尺寸(Size);符號2為幅度值(Amplitude)。
(2)熵編碼
對于AC系數,符號1和符號2分別進行編碼。零行程長度超過15個時,有一個符號(15,0),塊結束時只有一個符號(0,0)。
對符號1進行Hufffman編碼(亮度,色差的Huffman碼表不同)。對符號2進行變長整數VLI編碼。舉例來說:Size=6時,Amplitude的范圍是-63~-32,以及32~63,對絕對值相同,符號相反的碼字之間為反碼關系。所以AC系數為32的碼字為100000,33的碼字為100001,-32的碼字為011111,-33的碼字為011110。符號2的碼字緊接于符號1的碼字之后。
對于DC系數,Y和UV的Huffman碼表也不同。
掉了這么半天的書包,你可能已經暈了,呵呵。舉個例子來說明上述過程就容易明白了。
下面為8×8的亮度(Y)圖象子塊經過量化后的系數。
15??? 0???? -1??? 0???? 0???? 0???? 0???? 0
-2??? -1??? 0???? 0???? 0???? 0???? 0???? 0
-1??? -1??? 0???? 0???? 0???? 0???? 0???? 0
0???? 0???? 0???? 0???? 0???? 0???? 0???? 0
0???? 0???? 0???? 0???? 0???? 0???? 0???? 0
0???? 0???? 0???? 0???? 0???? 0???? 0???? 0
0???? 0???? 0???? 0???? 0???? 0???? 0???? 0
0???? 0???? 0???? 0???? 0???? 0???? 0???? 0
可見量化后只有左上角的幾個點(低頻分量)不為零,這樣采用行程編碼就很有效。
第一步,熵編碼的中間格式表示:先看DC系數。假設前一個8×8子塊DC系數的量化值為12,則本塊DC系數與它的差為3,根據下表
Size???????????????????????????? Amplitude
0??????????????????????????????????????? 0
1??????????????????????????????????????? –1,1
2??????????????????????????????????????? –3,-2,2,3
3??????????????????????????????????????? –7~-4,4~7
4??????????????????????????????????????? –15~-8,8~15
5??????????????????????????????????????? –31~-16,16~31
6??????????????????????????????????????? –63~-32,32~63
7??????????????????????????????????????? –127~-64,64~127
8??????????????????????????????????????? –255~-128,128~255
9??????????????????????????????????????? –511~-256,256~511
10?????????????????????????????????????? –1023~512,512~1023
11?????????????????????????????????????? –2047~-1024,1024~2047
查表得Size=2,Amplitude=3,所以DC中間格式為(2)(3)。
下面對AC系數編碼。經過Zig-Zag掃描后,遇到的第一個非零系數為-2,其中遇到零的個數為1(即RunLength),根據下面這張AC系數表:
Size???????????????????????????? Amplitude
1??????????????????????????????????????? –1,1
2??????????????????????????????????????? –3,-2,2,3
3??????????????????????????????????????? –7~-4,4~7
4??????????????????????????????????????? –15~-8,8~15
5??????????????????????????????????????? –31~-16,16~31
6??????????????????????????????????????? –63~-32,32~63
7??????????????????????????????????????? –127~-64,64~127
8??????????????????????????????????????? –255~-128,128~255
9??????????????????????????????????????? –511~-256,256~511
10?????????????????????????????????????? –1023~512,512~1023
查表得Size=2。所以RunLength=1,Size=2,Amplitude=3,所以AC中間格式為(1,2)(-2)。
其余的點類似,可以求得這個8×8子塊熵編碼的中間格式為
(DC)(2)(3),(1,2)(-2),(0,1)(-1),(0,1)(-1),(0,1)(-1),(2,1)(-1),(EOB)(0,0)
第二步,熵編碼:
對于(2)(3):2查DC亮度Huffman表得到11,3經過VLI編碼為011;
對于(1,2)(-2):(1,2)查AC亮度Huffman表得到11011,-2是2的反碼,為01;
對于(0,1)(-1):(0,1)查AC亮度Huffman表得到00,-1是1的反碼,為0;
……
最后,這一8×8子塊亮度信息壓縮后的數據流為11011, 1101101, 000, 000, 000, 111000,1010。總共31比特,其壓縮比是64×8/31=16.5,大約每個象素用半個比特。
總結
以上是生活随笔為你收集整理的DTV 学习(二) 数字视频的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 关于PS中RGB和CMYK的区别
- 下一篇: Common Lisp学习之一:初识CL
