視頻通信中的視頻壓縮介紹
2008/05/30
關(guān)于色彩圖1:典型的I、P和B幀序列。
視頻壓縮標(biāo)準(zhǔn)某些時(shí)候限制運(yùn)動(dòng)矢量的水平和垂直分量,這樣在運(yùn)動(dòng)估計(jì)時(shí)每個(gè)宏塊和所選擇的16x16像素區(qū)域之間最大可能的距離會(huì)遠(yuǎn)小于幀的寬度或高度。這種限制輕微地減少了對(duì)運(yùn)動(dòng)矢量進(jìn)行編碼所需要的數(shù)據(jù)位數(shù),也減少了執(zhí)行運(yùn)動(dòng)估計(jì)所需要的運(yùn)算量。包含在允許的運(yùn)動(dòng)矢量中的所有可能的16x16像素區(qū)域的基準(zhǔn)幀部分被稱(chēng)為“搜尋區(qū)域”。
此外,先進(jìn)的視頻壓縮標(biāo)準(zhǔn)允許運(yùn)動(dòng)矢量具有非整數(shù)的值。即,編碼器可能估計(jì)針對(duì)某個(gè)指定宏塊當(dāng)前幀與基準(zhǔn)幀之間的運(yùn)動(dòng)距離不是整數(shù)個(gè)像素。運(yùn)動(dòng)矢量的分辨率為半個(gè)或四分之一個(gè)像素很常見(jiàn)。因此,為預(yù)測(cè)當(dāng)前宏塊中的像素,必須對(duì)基準(zhǔn)幀中的對(duì)應(yīng)區(qū)域進(jìn)行插值處理來(lái)估算出在非整數(shù)像素位置的像素值。按上面介紹的方法對(duì)預(yù)測(cè)與實(shí)際像素值之間的差值進(jìn)行計(jì)算并編碼。
運(yùn)動(dòng)估計(jì)是圖像壓縮應(yīng)用中運(yùn)算量非常大的任務(wù),需要視頻編碼器80%的處理能力。最簡(jiǎn)單徹底的運(yùn)動(dòng)估計(jì)方法是在搜尋區(qū)域中評(píng)估每一個(gè)可能的16x16像素區(qū)域,選擇最匹配的。通常,利用“絕對(duì)差異值之和”(SAD)或“平方差異值之和”(SSD)運(yùn)算來(lái)確定一個(gè)16x16像素區(qū)域與一個(gè)宏塊到底有多匹配。通常只對(duì)亮度層進(jìn)行SAD和SSD運(yùn)算,但是也可以包括色度層。例如,一個(gè)48x24像素的相對(duì)較小搜尋區(qū)域可能包括分辨率為像素的1024個(gè)16x16區(qū)域。僅對(duì)這樣一個(gè)區(qū)域的亮度層進(jìn)行SAD運(yùn)算需要做256次減法、256次絕對(duì)值運(yùn)算以及255次加法運(yùn)算。因此,還不包括非整數(shù)運(yùn)動(dòng)矢量所要求的插值處理,要進(jìn)行最佳的匹配,這樣的搜尋區(qū)域進(jìn)行徹底的掃描所需要的運(yùn)算單個(gè)宏塊需要785,408次算術(shù)運(yùn)算,這相當(dāng)于在CIF分辨率(352x288像素),幀率為每秒15幀下,每秒4.6億次算術(shù)運(yùn)算。
由于這種高運(yùn)算量,運(yùn)動(dòng)估計(jì)的實(shí)際實(shí)現(xiàn)并不適用徹底搜尋。相反,運(yùn)動(dòng)估計(jì)算法使用各種方法來(lái)選擇有限數(shù)量的備選運(yùn)動(dòng)矢量(大多數(shù)情況下大約10到100個(gè)矢量),只對(duì)與這些備選矢量對(duì)應(yīng)的16x16像素區(qū)域進(jìn)行評(píng)估。一種方法是在幾個(gè)階段來(lái)選擇備選運(yùn)動(dòng)矢量。例如,可能選擇5個(gè)初始備選矢量,并進(jìn)行評(píng)估。結(jié)果用來(lái)清除搜尋區(qū)域中不可能的部分,對(duì)搜尋區(qū)域中最有可能的部分進(jìn)行處理。選擇5個(gè)新的矢量,并重復(fù)這種處理。通過(guò)幾次這樣的過(guò)程,就可以得到最佳的運(yùn)動(dòng)矢量。
在視頻序列中的當(dāng)前幀和前一幀中針對(duì)周邊宏塊所選擇的運(yùn)動(dòng)矢量的另一種分析方法是試圖預(yù)測(cè)當(dāng)前宏塊中的運(yùn)動(dòng)。根據(jù)這種分析來(lái)選擇一些備選的運(yùn)動(dòng)矢量,并只對(duì)這些矢量進(jìn)行評(píng)估。
通過(guò)選擇一個(gè)較少的被選矢量而不是對(duì)搜尋區(qū)域的徹底掃描,運(yùn)動(dòng)估計(jì)的運(yùn)算需求可以大大地減少,某些時(shí)候超過(guò)兩個(gè)數(shù)量級(jí)。值得注意的是,在圖像質(zhì)量/壓縮率和運(yùn)算量之間具有一種折衷關(guān)系:使用更多的運(yùn)動(dòng)矢量允許編碼器在基準(zhǔn)幀內(nèi)找到一個(gè)16x16像素的區(qū)域,這些區(qū)域能更好地匹配每一個(gè)宏塊,這樣減少預(yù)測(cè)誤差。因此,增加被選矢量允許預(yù)測(cè)誤差以更少的數(shù)據(jù)位或者更高的精度進(jìn)行編碼,而代價(jià)就是執(zhí)行更多地SAD(或者)SSD運(yùn)算。
除了上面描述的兩種方法外,還有很多其他選擇適當(dāng)備選運(yùn)動(dòng)矢量的方法,包括各種的專(zhuān)有解決方案。大多數(shù)視頻壓縮標(biāo)準(zhǔn)僅僅規(guī)定了壓縮視頻碼流的格式以及解碼步驟,而對(duì)編碼過(guò)程無(wú)定義,因此編碼器可以采用各種方法來(lái)進(jìn)行運(yùn)動(dòng)估計(jì)。
運(yùn)動(dòng)估計(jì)方法是那些符合相同標(biāo)準(zhǔn)的視頻編碼器實(shí)現(xiàn)之間的最大差異。運(yùn)動(dòng)估計(jì)方法的選擇大大地影響了運(yùn)算要求和視頻質(zhì)量,因此市場(chǎng)上提供的編碼器內(nèi)的運(yùn)動(dòng)估計(jì)方法細(xì)節(jié)常常是嚴(yán)格保守的商業(yè)秘密。
很多針對(duì)多媒體應(yīng)用的處理器都提供了加速SAD運(yùn)算的專(zhuān)門(mén)指令,或者專(zhuān)用的SAD協(xié)處理器來(lái)從CPU轉(zhuǎn)移這種需要大量運(yùn)算的任務(wù)。
值得注意的是,為了執(zhí)行這種運(yùn)動(dòng)估計(jì),除了當(dāng)前幀以外,編碼器必須在存儲(chǔ)器中保留一個(gè)或兩個(gè)基準(zhǔn)幀。所需要的幀緩存通常都比片上可提供的存儲(chǔ)器大很多,在很多應(yīng)用中都需要額外的存儲(chǔ)器芯片。將基準(zhǔn)幀存儲(chǔ)在片外存儲(chǔ)器中導(dǎo)致要求編碼器非常高的外部存儲(chǔ)器帶寬,盡管大的片上緩存有助于大大減少所要求的帶寬。
某些視頻壓縮標(biāo)準(zhǔn)允許每個(gè)宏塊被分割成兩個(gè)或四個(gè)部分,每個(gè)部分有一個(gè)獨(dú)立的運(yùn)動(dòng)矢量。與一個(gè)運(yùn)動(dòng)矢量相比,這種選擇需要更多的數(shù)據(jù)位來(lái)對(duì)兩個(gè)或四個(gè)部分進(jìn)行編碼。然而,如果增加的運(yùn)動(dòng)矢量能更好地預(yù)測(cè)宏塊像素,則對(duì)每個(gè)預(yù)測(cè)進(jìn)行編碼所需要的數(shù)據(jù)位更少,這又是很有益的。
運(yùn)動(dòng)補(bǔ)償
在視頻編碼器中,運(yùn)動(dòng)補(bǔ)償利用在視頻碼流中被編碼的運(yùn)動(dòng)矢量來(lái)預(yù)測(cè)每個(gè)宏塊中的像素。如果運(yùn)動(dòng)矢量的水平和垂直分量都是整數(shù)值的話(huà),預(yù)測(cè)的宏塊就僅僅是基準(zhǔn)幀中16x16像素區(qū)域的一個(gè)拷貝。如果運(yùn)動(dòng)矢量的任意個(gè)分量具有非整數(shù)值,則需要用到插值來(lái)估計(jì)非整數(shù)像素位置的圖像。然后,對(duì)預(yù)測(cè)誤差進(jìn)行編碼,并加入到預(yù)測(cè)宏塊中以重構(gòu)實(shí)際的宏塊像素。
與運(yùn)動(dòng)估計(jì)相比,運(yùn)動(dòng)補(bǔ)償?shù)倪\(yùn)算需求小很多。盡管運(yùn)動(dòng)估計(jì)必須對(duì)每個(gè)宏塊的若干16x16像素區(qū)域執(zhí)行SAD或SSD運(yùn)算,運(yùn)動(dòng)補(bǔ)償僅對(duì)這樣的區(qū)域進(jìn)行拷貝或插值處理。由于這樣的重要差別,視頻解碼的運(yùn)算量比視頻編碼少很多。而且,在視頻解碼器中,運(yùn)動(dòng)補(bǔ)償可以依然占用達(dá)40%的處理器性能,盡管這個(gè)數(shù)字對(duì)于不同的視頻序列、視頻壓縮標(biāo)準(zhǔn)和解碼器的實(shí)現(xiàn)來(lái)說(shuō)會(huì)有很大的差別。例如,對(duì)于很少使用插值的幀的運(yùn)動(dòng)補(bǔ)償工作載荷可能只占解碼器的處理性能的5%。
與運(yùn)動(dòng)估計(jì)相似,運(yùn)動(dòng)補(bǔ)償需要視頻解碼器在存儲(chǔ)器中保存一個(gè)或兩個(gè)基準(zhǔn)幀,通常需要外部存儲(chǔ)器芯片來(lái)實(shí)現(xiàn)這個(gè)目的。然而,運(yùn)動(dòng)補(bǔ)償比運(yùn)動(dòng)估計(jì)更少地訪(fǎng)問(wèn)基準(zhǔn)幀緩存。因此,存儲(chǔ)器帶寬要求沒(méi)有運(yùn)動(dòng)估計(jì)那么嚴(yán)格,盡管為了在運(yùn)動(dòng)補(bǔ)償功能中獲得更佳的處理器性能,依然希望有高的存儲(chǔ)器帶寬。
減少視頻瑕疵
馬賽克與環(huán)狀瑕疵
理想情況是,有損耗的圖像和視頻壓縮算法僅僅丟棄那些視覺(jué)并不重要的信息,因此人眼重構(gòu)的圖像和視頻序列和原來(lái)未壓縮的圖像或視頻是相同的。然而實(shí)際上,依然可能出現(xiàn)某些視覺(jué)上可見(jiàn)的瑕疵。由于編碼器的設(shè)計(jì)并不完美而出現(xiàn)這種問(wèn)題,視頻內(nèi)容的編碼尤其具有挑戰(zhàn)性,或者針對(duì)視頻序列分辨率和幀率所選擇碼率太低。后面的這種情況尤其常見(jiàn),因此很多應(yīng)用必須權(quán)衡視頻質(zhì)量與減少存儲(chǔ)和帶寬要求之間的矛盾。
視頻壓縮中“馬賽克”和“環(huán)狀”瑕疵最為常見(jiàn)。馬賽克是由于壓縮算法將每個(gè)幀分割成8像素x8像素的塊造成。每個(gè)塊在重構(gòu)時(shí)都在鄰近邊緣有一些誤差,使得塊邊緣可見(jiàn)。環(huán)狀瑕疵是由于編碼器在量化高頻DCT系數(shù)時(shí)丟棄太多的信息所致。環(huán)狀瑕疵的表現(xiàn)為在圖像特征的邊緣出現(xiàn)失真。
解決馬賽克和環(huán)狀瑕疵的圖像濾波器
視頻壓縮應(yīng)用通常在解壓縮之后采用濾波器來(lái)減少上述的瑕疵。這些濾波步驟被稱(chēng)為去馬賽克和去環(huán)處理。它們都利用了低通FIR(有限脈沖響應(yīng))濾波器來(lái)隱藏這些可見(jiàn)的瑕疵。去馬賽克濾波器應(yīng)用到圖像塊的邊緣,將每個(gè)塊的邊緣與其相鄰的塊的邊緣進(jìn)行混合,以此來(lái)隱藏這些馬賽克瑕疵。去環(huán)處理通常使用一個(gè)自適應(yīng)濾波器,該濾波器首先檢測(cè)到圖像特征的邊緣。然后對(duì)鄰近檢測(cè)邊緣的區(qū)域進(jìn)行低通濾波,從而消除環(huán)狀瑕疵,但是邊緣像素本身并沒(méi)有被濾除,或者很少地被濾除,以避免出現(xiàn)模糊。
這兩種濾波器都需要很大的運(yùn)算量。這些濾波器結(jié)合使用會(huì)比視頻解碼器本身占用更多的處理器處理性能。例如,針對(duì)ARM9E通用處理器內(nèi)核進(jìn)行過(guò)優(yōu)化的一個(gè)MPEG-4簡(jiǎn)單規(guī)格、第一級(jí)(176x144像素,15fps)解碼器在對(duì)一個(gè)中等復(fù)雜度的視頻流進(jìn)行解碼時(shí),需要處理器的指令周期運(yùn)行速率為14MHz。如果增加去馬賽克處理,處理器必須運(yùn)行在33MHz。如果同時(shí)要求兩種處理,則處理器必須運(yùn)行在39MHz條件下—幾乎是單獨(dú)視頻解壓縮算法的時(shí)鐘速率要求的三倍。
后處理與在線(xiàn)實(shí)現(xiàn)的比較
這兩種濾波器可以作為一個(gè)獨(dú)立于視頻解壓縮的單獨(dú)后續(xù)處理步驟用在視頻幀上。這種方法為系統(tǒng)設(shè)計(jì)者提供了針對(duì)他們的應(yīng)用選擇最佳的去馬賽克和/或去環(huán)濾波器的靈活性,或者完全放棄這兩種濾波器以降低運(yùn)算需求。在這種方法中,視頻解碼器利用每個(gè)未濾波的重構(gòu)幀作為對(duì)未來(lái)的視頻幀進(jìn)行解碼的基準(zhǔn)幀,最后的濾波視頻輸出還需要一個(gè)額外的幀緩存。
另外一種方法是將去馬賽克和/或去環(huán)狀瑕疵功能整合到視頻解壓縮算法中。這種方法某些時(shí)候稱(chēng)為“環(huán)形濾波”,利用濾波后的重構(gòu)幀作為基準(zhǔn)幀來(lái)解碼未來(lái)的視頻幀。這種方法要求視頻解碼器像編碼器那樣執(zhí)行相同的去馬賽克和/或去環(huán)狀瑕疵濾波,以使每個(gè)用于編碼的基準(zhǔn)幀與用于解碼的一樣。需要在編碼器中進(jìn)行濾波處理增加了對(duì)處理器的性能要求,但是可以提高圖像質(zhì)量,特別是當(dāng)碼率很低的時(shí)候。此外,當(dāng)去馬賽克和/或去環(huán)狀瑕疵功能作為一個(gè)獨(dú)立的后續(xù)處理步驟實(shí)現(xiàn)時(shí)需要的額外幀緩存,而整合到壓縮算法中則不需要。
色彩空間轉(zhuǎn)換
正如前面所述,視頻壓縮算法通常利用亮度和色度層來(lái)展現(xiàn)彩色圖像。不同的是,攝像機(jī)和顯示器通常將紅色、藍(lán)色和綠色光混合來(lái)展現(xiàn)不同的顏色。因此,攝像機(jī)捕捉到的紅、綠、藍(lán)像素必須轉(zhuǎn)換成亮度和色度值以進(jìn)行視頻編碼,視頻編碼器的亮度和色度像素輸出必須轉(zhuǎn)換成特定的紅、綠、藍(lán)電平進(jìn)行顯示。這種轉(zhuǎn)換方程每個(gè)圖像像素需要12個(gè)算術(shù)運(yùn)算,還不包括用于補(bǔ)償在視頻壓縮算法的輸入和輸出中色度層比亮度層具有更低的分辨率所需要插值運(yùn)算。對(duì)于每秒15幀CIF(352x288
像素)的圖像分辨率來(lái)說(shuō),轉(zhuǎn)換(沒(méi)有任何插值運(yùn)算)需要每秒1,800萬(wàn)次運(yùn)算。這種運(yùn)算量相當(dāng)大;如果用軟件來(lái)實(shí)現(xiàn),色彩轉(zhuǎn)換大約需要視頻解碼器所需要的處理器周期的三分之一或三分之二。
趨勢(shì)與結(jié)論
視頻壓縮算法采用了多種技術(shù),例如運(yùn)動(dòng)估計(jì)、轉(zhuǎn)換和可變長(zhǎng)度編碼。盡管大多數(shù)當(dāng)前的視頻壓縮算法共享這些的基本任務(wù),在算法和實(shí)現(xiàn)方法上存在大量的變化。例如,在不同的編碼器中,甚至即使符合相同的壓縮標(biāo)準(zhǔn),執(zhí)行運(yùn)動(dòng)估計(jì)的算術(shù)方法和實(shí)現(xiàn)方法都可能不同。此外,對(duì)于某個(gè)信號(hào)處理任務(wù)來(lái)說(shuō),最有效的實(shí)現(xiàn)方法對(duì)于不同的處理器來(lái)說(shuō)也可能有很大的差別,即使每個(gè)處理器使用一種相似的算法。最后,某些任務(wù)的運(yùn)算量,如運(yùn)動(dòng)補(bǔ)償,根據(jù)不同的視頻節(jié)目?jī)?nèi)容變化很大。因此,在某個(gè)特定的處理器上,視頻編碼器或解碼器的運(yùn)算負(fù)擔(dān)很難以預(yù)測(cè)。
盡管有這些可變性,依然可以很容易地發(fā)現(xiàn)幾個(gè)趨勢(shì):
運(yùn)動(dòng)估計(jì)是視頻壓縮處理中運(yùn)算需求最大的任務(wù),通常使編碼器的運(yùn)算負(fù)擔(dān)為解碼器的幾倍。
解碼器的運(yùn)算負(fù)擔(dān)通常決定于可變長(zhǎng)解碼、逆轉(zhuǎn)換和運(yùn)動(dòng)補(bǔ)償功能。
運(yùn)動(dòng)估計(jì)、運(yùn)動(dòng)補(bǔ)償、轉(zhuǎn)換和量化/去量化任務(wù)的運(yùn)算負(fù)擔(dān)通常與每個(gè)幀的像素?cái)?shù)量和幀率成正比。不同的是,可變長(zhǎng)解碼功能的運(yùn)算量與壓縮視頻碼流的碼率成正比。
在解碼后的視頻流中應(yīng)用的后處理步驟,即去馬賽克、去環(huán)狀瑕疵以及色彩空間轉(zhuǎn)換都大大地增加了視頻解碼應(yīng)用的運(yùn)算負(fù)擔(dān)。這些功能的運(yùn)算負(fù)擔(dān)會(huì)很容易地超過(guò)視頻壓縮步驟,與每個(gè)幀的像素?cái)?shù)量以及幀率成正比。
相比于運(yùn)算量的預(yù)測(cè),視頻壓縮應(yīng)用的存儲(chǔ)器要求的預(yù)測(cè)容易得多:在視頻壓縮應(yīng)用中,存儲(chǔ)器主要取決于用于存儲(chǔ)當(dāng)前和基準(zhǔn)幀的大容量緩存。如果壓縮方案支持I-和P-幀,只需要兩個(gè)幀緩存;如果還支持B-幀的話(huà),則需要三個(gè)緩存。像去馬賽克、去環(huán)狀瑕疵、色彩空間轉(zhuǎn)換的后處理步驟可能需要另外的輸出緩存。這些緩存的大小與每個(gè)幀的像素?cái)?shù)量成正比。
與像程序存儲(chǔ)器、查找表以及中間數(shù)據(jù)等因素相結(jié)合,組成通常視頻應(yīng)用的存儲(chǔ)器需求的重要部分,盡管這個(gè)部分通常只有幀緩存存儲(chǔ)器的幾分之一。
實(shí)現(xiàn)高度優(yōu)化的視頻編碼和解碼軟件需要徹底地理解本文介紹的目標(biāo)處理器的信號(hào)處理概念。大多數(shù)的視頻壓縮標(biāo)準(zhǔn)不會(huì)規(guī)定運(yùn)動(dòng)估計(jì)的方法。盡管基準(zhǔn)編碼器適合于大多數(shù)的標(biāo)準(zhǔn),深入了解視頻壓縮算法通常允許設(shè)計(jì)師利用更多成熟的運(yùn)動(dòng)估計(jì)方法,并獲得更好的結(jié)果。此外,全面理解信號(hào)處理原理,實(shí)現(xiàn)信號(hào)處理功能,以及了解目標(biāo)處理器的細(xì)節(jié)知識(shí)對(duì)于有效地將視頻壓縮算法中的各種任務(wù)對(duì)應(yīng)到處理器的結(jié)構(gòu)資源來(lái)說(shuō)是非常重要的。
Berkeley設(shè)計(jì)技術(shù)公司
迪威汪倫:品牌并非國(guó)內(nèi)視頻廠(chǎng)商不可逾越的障礙 2008-05-30 |
揭密顯示屏幕背后的高清晰電視技術(shù) 2008-05-30 |
四招打造SMB視頻會(huì)議方案 2008-05-28 |
讓視頻會(huì)議多一些人工智能 2008-05-28 |
視頻會(huì)議系統(tǒng)應(yīng)用方案的比較 2008-05-28 |