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