首頁>>>技術(shù)>>>視像通信  視像通信產(chǎn)品

視頻通信中的視頻壓縮介紹

2008/05/30

關(guān)于色彩

  彩色圖像通常用幾個“色彩層”來呈現(xiàn)。例如,RGB彩色圖像包含紅色層、綠色層和藍(lán)色層。每一個層包含單一色彩(紅色、綠色或藍(lán)色)的整個圖像。當(dāng)這三層重疊或混合后,將組成全彩圖。為將彩色圖像進(jìn)行壓縮,本文描述的靜態(tài)圖像壓縮方法將依次應(yīng)用到每個色彩層。

  視頻壓縮應(yīng)用通常使用一種色彩層不對應(yīng)特定色彩的色彩方案。通常是,一個色彩層包含亮度信息(彩色圖像中每個像素的總亮度),兩個層包含色彩(色度)信息,色度信息與亮度信息結(jié)合起來可以得到每個圖像像素特定紅、綠和藍(lán)色彩。

  這樣的色彩方案非常方便,因為人眼對亮度比對色度更敏感,因此色度層的編碼和存儲圖像分辨率都比亮度信息更低。特別是視頻壓縮算法通常對色度層的垂直和水平編碼的分辨率都僅為亮度層的一半。因此,在亮度層中的每個16 x16像素區(qū)域內(nèi),每個色度層包含一個8x8像素的塊。在典型的視頻壓縮算法中,“宏塊”為視頻幀中的一個16x16像素的區(qū)域,該宏塊包含4個8x8亮度塊,以及兩個對應(yīng)的8x8色度塊。宏塊允許采用后面介紹的運動估計和補償,這兩個技術(shù)將與上面介紹的色度層次采樣結(jié)合使用。

增加運動因素

  使用上面介紹的方法,像JPEG這樣的靜態(tài)圖像壓縮算法可以在壓縮率為10:1的條件下獲得很好的圖像質(zhì)量。最先進(jìn)的靜態(tài)圖像編碼器在壓縮率高達(dá)30:1下也能獲得很好的圖像質(zhì)量。視頻壓縮算法采用運動估計和補償可以利用連續(xù)視頻幀之間的相似性。這樣可以使視頻壓縮算法在壓縮率達(dá)200:1的情況下獲得很好的視頻質(zhì)量。

  在某些視頻場景下,例如新聞節(jié)目中運動圖像很少。在這種情況下,每個視頻幀中的8x8像素的塊大部分與前一幀是相同的,或者接近相同。壓縮算法通過運算兩個幀之間的差異性可以利用這一事實,利用上面介紹的靜態(tài)圖像壓縮方法來對這種差異性進(jìn)行編碼。對于大部分圖像塊來說,這種差異性很小,與單獨對每個幀進(jìn)行編碼相比,這種方法需要的編碼數(shù)據(jù)位非常少。然而,如果攝像機是進(jìn)行搖攝的或者場景中某個大的物體在移動,那么每個塊將不再與前一幀中對應(yīng)塊相同。相反,與前一幀中8x8像素區(qū)域相似的塊位置發(fā)生了偏移,產(chǎn)生了與運動方向?qū)?yīng)的一個距離。值得注意的是,每個視頻幀通常由兩個色度層和一個亮度層組成,如上面所述。很顯然,每個層的運動情況是相同的。盡管亮度和色度層的分辨率不同,為利用這種事實,以宏塊而不是以三個層中單獨的8x8像素塊進(jìn)行運動研究。

運動估計和補償

  運動估計是嘗試發(fā)現(xiàn)在前一編碼幀(稱為“基準(zhǔn)幀”)中的一個與當(dāng)前幀中每個宏塊緊密匹配的區(qū)域。對于每一個宏塊來說,運動估計產(chǎn)生一個“運動矢量”。運動矢量是由當(dāng)前幀中宏塊相對于所選擇的16x16像素區(qū)域的基準(zhǔn)幀中位置的水平和垂直偏移組成。視頻編碼器通常使用VLC來對視頻碼流中的運動矢量進(jìn)行編碼。所選擇的16x16像素區(qū)域被用于當(dāng)前宏模塊中像素的預(yù)測,使用上面介紹的靜態(tài)圖像壓縮方法來進(jìn)行宏塊之間的差異以及所選擇區(qū)域(預(yù)測誤差)的運算和編碼。絕大多數(shù)的視頻壓縮標(biāo)準(zhǔn)允許在編碼器不能發(fā)現(xiàn)宏塊的足夠好的匹配時,忽略這種預(yù)測。這時,對宏塊本身進(jìn)行編碼,而不是對預(yù)測誤差進(jìn)行編碼。

  值得注意的是,基準(zhǔn)幀并不總是連續(xù)視頻幀中的前一個顯示幀。視頻壓縮算法通常對幀的編碼順序與他們顯示的順序是不相同。編碼器可能向前跳過幾個幀,對未來的幀進(jìn)行編碼,然后跳回來,對顯示序列中的下一個幀編碼。之所以這樣做,是因為可以利用編碼的未來幀作為基準(zhǔn)幀向后及時地實現(xiàn)運動估計。視頻壓縮算法還可以使用兩個基準(zhǔn)幀—一個是前面已顯示的幀,一個是前面已編碼的未來幀。這樣允許編碼器從任意一個基準(zhǔn)幀中選擇一個16X16像素的區(qū)域,或者在前面顯示幀的16X16像素區(qū)域和未來幀的16X16像素區(qū)域之間通過插值方法預(yù)測一個宏塊。

  依賴前一個編碼幀來對每一個新幀解碼進(jìn)行修正的一個缺點是,一個幀的傳遞錯誤會使每個緊隨而來的幀不能重建。為緩解這個問題,視頻壓縮標(biāo)準(zhǔn)偶爾只使用靜態(tài)圖像編碼方法對一個視頻幀進(jìn)行編碼,而不需依賴于前一個編碼幀。這些幀就成為“內(nèi)幀”(或I frame,即I幀)。如果壓縮碼流中的一個幀因為錯誤而被破壞,視頻解碼器必須等到下一個I幀,這種方法就不需要基準(zhǔn)幀來進(jìn)行視頻重構(gòu)。

  僅僅使用前一個顯示的基準(zhǔn)幀來編碼的幀被稱為“P幀”,同時使用前一個顯示幀和未來幀作為基準(zhǔn)幀進(jìn)行編碼的幀稱為“B幀”。在通常的場景中,編解碼器編碼一個I幀,然后向前跳過幾個幀,用編碼I幀作為基準(zhǔn)幀對一個未來P幀進(jìn)行編碼,然后跳回到I幀之后的下一個幀。編碼的I幀和P幀之間的幀被編碼為B幀。之后,編碼器會再次跳過幾個幀,使用第一個P幀作為基準(zhǔn)幀編碼另外一個P幀,然后再次跳回,用B幀填充顯示序列中的空隙。這個過程不斷繼續(xù),每12到15個P幀和B幀內(nèi)插入一個新的I幀。例如,圖1種給出了一個典型的視頻幀序列。

圖1:典型的I、P和B幀序列。

  視頻壓縮標(biāo)準(zhǔn)某些時候限制運動矢量的水平和垂直分量,這樣在運動估計時每個宏塊和所選擇的16x16像素區(qū)域之間最大可能的距離會遠(yuǎn)小于幀的寬度或高度。這種限制輕微地減少了對運動矢量進(jìn)行編碼所需要的數(shù)據(jù)位數(shù),也減少了執(zhí)行運動估計所需要的運算量。包含在允許的運動矢量中的所有可能的16x16像素區(qū)域的基準(zhǔn)幀部分被稱為“搜尋區(qū)域”。

  此外,先進(jìn)的視頻壓縮標(biāo)準(zhǔn)允許運動矢量具有非整數(shù)的值。即,編碼器可能估計針對某個指定宏塊當(dāng)前幀與基準(zhǔn)幀之間的運動距離不是整數(shù)個像素。運動矢量的分辨率為半個或四分之一個像素很常見。因此,為預(yù)測當(dāng)前宏塊中的像素,必須對基準(zhǔn)幀中的對應(yīng)區(qū)域進(jìn)行插值處理來估算出在非整數(shù)像素位置的像素值。按上面介紹的方法對預(yù)測與實際像素值之間的差值進(jìn)行計算并編碼。

  運動估計是圖像壓縮應(yīng)用中運算量非常大的任務(wù),需要視頻編碼器80%的處理能力。最簡單徹底的運動估計方法是在搜尋區(qū)域中評估每一個可能的16x16像素區(qū)域,選擇最匹配的。通常,利用“絕對差異值之和”(SAD)或“平方差異值之和”(SSD)運算來確定一個16x16像素區(qū)域與一個宏塊到底有多匹配。通常只對亮度層進(jìn)行SAD和SSD運算,但是也可以包括色度層。例如,一個48x24像素的相對較小搜尋區(qū)域可能包括分辨率為像素的1024個16x16區(qū)域。僅對這樣一個區(qū)域的亮度層進(jìn)行SAD運算需要做256次減法、256次絕對值運算以及255次加法運算。因此,還不包括非整數(shù)運動矢量所要求的插值處理,要進(jìn)行最佳的匹配,這樣的搜尋區(qū)域進(jìn)行徹底的掃描所需要的運算單個宏塊需要785,408次算術(shù)運算,這相當(dāng)于在CIF分辨率(352x288像素),幀率為每秒15幀下,每秒4.6億次算術(shù)運算。

  由于這種高運算量,運動估計的實際實現(xiàn)并不適用徹底搜尋。相反,運動估計算法使用各種方法來選擇有限數(shù)量的備選運動矢量(大多數(shù)情況下大約10到100個矢量),只對與這些備選矢量對應(yīng)的16x16像素區(qū)域進(jìn)行評估。一種方法是在幾個階段來選擇備選運動矢量。例如,可能選擇5個初始備選矢量,并進(jìn)行評估。結(jié)果用來清除搜尋區(qū)域中不可能的部分,對搜尋區(qū)域中最有可能的部分進(jìn)行處理。選擇5個新的矢量,并重復(fù)這種處理。通過幾次這樣的過程,就可以得到最佳的運動矢量。

  在視頻序列中的當(dāng)前幀和前一幀中針對周邊宏塊所選擇的運動矢量的另一種分析方法是試圖預(yù)測當(dāng)前宏塊中的運動。根據(jù)這種分析來選擇一些備選的運動矢量,并只對這些矢量進(jìn)行評估。

  通過選擇一個較少的被選矢量而不是對搜尋區(qū)域的徹底掃描,運動估計的運算需求可以大大地減少,某些時候超過兩個數(shù)量級。值得注意的是,在圖像質(zhì)量/壓縮率和運算量之間具有一種折衷關(guān)系:使用更多的運動矢量允許編碼器在基準(zhǔn)幀內(nèi)找到一個16x16像素的區(qū)域,這些區(qū)域能更好地匹配每一個宏塊,這樣減少預(yù)測誤差。因此,增加被選矢量允許預(yù)測誤差以更少的數(shù)據(jù)位或者更高的精度進(jìn)行編碼,而代價就是執(zhí)行更多地SAD(或者)SSD運算。

  除了上面描述的兩種方法外,還有很多其他選擇適當(dāng)備選運動矢量的方法,包括各種的專有解決方案。大多數(shù)視頻壓縮標(biāo)準(zhǔn)僅僅規(guī)定了壓縮視頻碼流的格式以及解碼步驟,而對編碼過程無定義,因此編碼器可以采用各種方法來進(jìn)行運動估計。

  運動估計方法是那些符合相同標(biāo)準(zhǔn)的視頻編碼器實現(xiàn)之間的最大差異。運動估計方法的選擇大大地影響了運算要求和視頻質(zhì)量,因此市場上提供的編碼器內(nèi)的運動估計方法細(xì)節(jié)常常是嚴(yán)格保守的商業(yè)秘密。

  很多針對多媒體應(yīng)用的處理器都提供了加速SAD運算的專門指令,或者專用的SAD協(xié)處理器來從CPU轉(zhuǎn)移這種需要大量運算的任務(wù)。

  值得注意的是,為了執(zhí)行這種運動估計,除了當(dāng)前幀以外,編碼器必須在存儲器中保留一個或兩個基準(zhǔn)幀。所需要的幀緩存通常都比片上可提供的存儲器大很多,在很多應(yīng)用中都需要額外的存儲器芯片。將基準(zhǔn)幀存儲在片外存儲器中導(dǎo)致要求編碼器非常高的外部存儲器帶寬,盡管大的片上緩存有助于大大減少所要求的帶寬。

  某些視頻壓縮標(biāo)準(zhǔn)允許每個宏塊被分割成兩個或四個部分,每個部分有一個獨立的運動矢量。與一個運動矢量相比,這種選擇需要更多的數(shù)據(jù)位來對兩個或四個部分進(jìn)行編碼。然而,如果增加的運動矢量能更好地預(yù)測宏塊像素,則對每個預(yù)測進(jìn)行編碼所需要的數(shù)據(jù)位更少,這又是很有益的。

運動補償

  在視頻編碼器中,運動補償利用在視頻碼流中被編碼的運動矢量來預(yù)測每個宏塊中的像素。如果運動矢量的水平和垂直分量都是整數(shù)值的話,預(yù)測的宏塊就僅僅是基準(zhǔn)幀中16x16像素區(qū)域的一個拷貝。如果運動矢量的任意個分量具有非整數(shù)值,則需要用到插值來估計非整數(shù)像素位置的圖像。然后,對預(yù)測誤差進(jìn)行編碼,并加入到預(yù)測宏塊中以重構(gòu)實際的宏塊像素。

  與運動估計相比,運動補償?shù)倪\算需求小很多。盡管運動估計必須對每個宏塊的若干16x16像素區(qū)域執(zhí)行SAD或SSD運算,運動補償僅對這樣的區(qū)域進(jìn)行拷貝或插值處理。由于這樣的重要差別,視頻解碼的運算量比視頻編碼少很多。而且,在視頻解碼器中,運動補償可以依然占用達(dá)40%的處理器性能,盡管這個數(shù)字對于不同的視頻序列、視頻壓縮標(biāo)準(zhǔn)和解碼器的實現(xiàn)來說會有很大的差別。例如,對于很少使用插值的幀的運動補償工作載荷可能只占解碼器的處理性能的5%。

  與運動估計相似,運動補償需要視頻解碼器在存儲器中保存一個或兩個基準(zhǔn)幀,通常需要外部存儲器芯片來實現(xiàn)這個目的。然而,運動補償比運動估計更少地訪問基準(zhǔn)幀緩存。因此,存儲器帶寬要求沒有運動估計那么嚴(yán)格,盡管為了在運動補償功能中獲得更佳的處理器性能,依然希望有高的存儲器帶寬。

減少視頻瑕疵

馬賽克與環(huán)狀瑕疵

  理想情況是,有損耗的圖像和視頻壓縮算法僅僅丟棄那些視覺并不重要的信息,因此人眼重構(gòu)的圖像和視頻序列和原來未壓縮的圖像或視頻是相同的。然而實際上,依然可能出現(xiàn)某些視覺上可見的瑕疵。由于編碼器的設(shè)計并不完美而出現(xiàn)這種問題,視頻內(nèi)容的編碼尤其具有挑戰(zhàn)性,或者針對視頻序列分辨率和幀率所選擇碼率太低。后面的這種情況尤其常見,因此很多應(yīng)用必須權(quán)衡視頻質(zhì)量與減少存儲和帶寬要求之間的矛盾。

  視頻壓縮中“馬賽克”和“環(huán)狀”瑕疵最為常見。馬賽克是由于壓縮算法將每個幀分割成8像素x8像素的塊造成。每個塊在重構(gòu)時都在鄰近邊緣有一些誤差,使得塊邊緣可見。環(huán)狀瑕疵是由于編碼器在量化高頻DCT系數(shù)時丟棄太多的信息所致。環(huán)狀瑕疵的表現(xiàn)為在圖像特征的邊緣出現(xiàn)失真。

解決馬賽克和環(huán)狀瑕疵的圖像濾波器

  視頻壓縮應(yīng)用通常在解壓縮之后采用濾波器來減少上述的瑕疵。這些濾波步驟被稱為去馬賽克和去環(huán)處理。它們都利用了低通FIR(有限脈沖響應(yīng))濾波器來隱藏這些可見的瑕疵。去馬賽克濾波器應(yīng)用到圖像塊的邊緣,將每個塊的邊緣與其相鄰的塊的邊緣進(jìn)行混合,以此來隱藏這些馬賽克瑕疵。去環(huán)處理通常使用一個自適應(yīng)濾波器,該濾波器首先檢測到圖像特征的邊緣。然后對鄰近檢測邊緣的區(qū)域進(jìn)行低通濾波,從而消除環(huán)狀瑕疵,但是邊緣像素本身并沒有被濾除,或者很少地被濾除,以避免出現(xiàn)模糊。

  這兩種濾波器都需要很大的運算量。這些濾波器結(jié)合使用會比視頻解碼器本身占用更多的處理器處理性能。例如,針對ARM9E通用處理器內(nèi)核進(jìn)行過優(yōu)化的一個MPEG-4簡單規(guī)格、第一級(176x144像素,15fps)解碼器在對一個中等復(fù)雜度的視頻流進(jìn)行解碼時,需要處理器的指令周期運行速率為14MHz。如果增加去馬賽克處理,處理器必須運行在33MHz。如果同時要求兩種處理,則處理器必須運行在39MHz條件下—幾乎是單獨視頻解壓縮算法的時鐘速率要求的三倍。

后處理與在線實現(xiàn)的比較

  這兩種濾波器可以作為一個獨立于視頻解壓縮的單獨后續(xù)處理步驟用在視頻幀上。這種方法為系統(tǒng)設(shè)計者提供了針對他們的應(yīng)用選擇最佳的去馬賽克和/或去環(huán)濾波器的靈活性,或者完全放棄這兩種濾波器以降低運算需求。在這種方法中,視頻解碼器利用每個未濾波的重構(gòu)幀作為對未來的視頻幀進(jìn)行解碼的基準(zhǔn)幀,最后的濾波視頻輸出還需要一個額外的幀緩存。

  另外一種方法是將去馬賽克和/或去環(huán)狀瑕疵功能整合到視頻解壓縮算法中。這種方法某些時候稱為“環(huán)形濾波”,利用濾波后的重構(gòu)幀作為基準(zhǔn)幀來解碼未來的視頻幀。這種方法要求視頻解碼器像編碼器那樣執(zhí)行相同的去馬賽克和/或去環(huán)狀瑕疵濾波,以使每個用于編碼的基準(zhǔn)幀與用于解碼的一樣。需要在編碼器中進(jìn)行濾波處理增加了對處理器的性能要求,但是可以提高圖像質(zhì)量,特別是當(dāng)碼率很低的時候。此外,當(dāng)去馬賽克和/或去環(huán)狀瑕疵功能作為一個獨立的后續(xù)處理步驟實現(xiàn)時需要的額外幀緩存,而整合到壓縮算法中則不需要。

色彩空間轉(zhuǎn)換

  正如前面所述,視頻壓縮算法通常利用亮度和色度層來展現(xiàn)彩色圖像。不同的是,攝像機和顯示器通常將紅色、藍(lán)色和綠色光混合來展現(xiàn)不同的顏色。因此,攝像機捕捉到的紅、綠、藍(lán)像素必須轉(zhuǎn)換成亮度和色度值以進(jìn)行視頻編碼,視頻編碼器的亮度和色度像素輸出必須轉(zhuǎn)換成特定的紅、綠、藍(lán)電平進(jìn)行顯示。這種轉(zhuǎn)換方程每個圖像像素需要12個算術(shù)運算,還不包括用于補償在視頻壓縮算法的輸入和輸出中色度層比亮度層具有更低的分辨率所需要插值運算。對于每秒15幀CIF(352x288 像素)的圖像分辨率來說,轉(zhuǎn)換(沒有任何插值運算)需要每秒1,800萬次運算。這種運算量相當(dāng)大;如果用軟件來實現(xiàn),色彩轉(zhuǎn)換大約需要視頻解碼器所需要的處理器周期的三分之一或三分之二。

趨勢與結(jié)論

  視頻壓縮算法采用了多種技術(shù),例如運動估計、轉(zhuǎn)換和可變長度編碼。盡管大多數(shù)當(dāng)前的視頻壓縮算法共享這些的基本任務(wù),在算法和實現(xiàn)方法上存在大量的變化。例如,在不同的編碼器中,甚至即使符合相同的壓縮標(biāo)準(zhǔn),執(zhí)行運動估計的算術(shù)方法和實現(xiàn)方法都可能不同。此外,對于某個信號處理任務(wù)來說,最有效的實現(xiàn)方法對于不同的處理器來說也可能有很大的差別,即使每個處理器使用一種相似的算法。最后,某些任務(wù)的運算量,如運動補償,根據(jù)不同的視頻節(jié)目內(nèi)容變化很大。因此,在某個特定的處理器上,視頻編碼器或解碼器的運算負(fù)擔(dān)很難以預(yù)測。

盡管有這些可變性,依然可以很容易地發(fā)現(xiàn)幾個趨勢:

  運動估計是視頻壓縮處理中運算需求最大的任務(wù),通常使編碼器的運算負(fù)擔(dān)為解碼器的幾倍。

  解碼器的運算負(fù)擔(dān)通常決定于可變長解碼、逆轉(zhuǎn)換和運動補償功能。

  運動估計、運動補償、轉(zhuǎn)換和量化/去量化任務(wù)的運算負(fù)擔(dān)通常與每個幀的像素數(shù)量和幀率成正比。不同的是,可變長解碼功能的運算量與壓縮視頻碼流的碼率成正比。

  在解碼后的視頻流中應(yīng)用的后處理步驟,即去馬賽克、去環(huán)狀瑕疵以及色彩空間轉(zhuǎn)換都大大地增加了視頻解碼應(yīng)用的運算負(fù)擔(dān)。這些功能的運算負(fù)擔(dān)會很容易地超過視頻壓縮步驟,與每個幀的像素數(shù)量以及幀率成正比。

  相比于運算量的預(yù)測,視頻壓縮應(yīng)用的存儲器要求的預(yù)測容易得多:在視頻壓縮應(yīng)用中,存儲器主要取決于用于存儲當(dāng)前和基準(zhǔn)幀的大容量緩存。如果壓縮方案支持I-和P-幀,只需要兩個幀緩存;如果還支持B-幀的話,則需要三個緩存。像去馬賽克、去環(huán)狀瑕疵、色彩空間轉(zhuǎn)換的后處理步驟可能需要另外的輸出緩存。這些緩存的大小與每個幀的像素數(shù)量成正比。

  與像程序存儲器、查找表以及中間數(shù)據(jù)等因素相結(jié)合,組成通常視頻應(yīng)用的存儲器需求的重要部分,盡管這個部分通常只有幀緩存存儲器的幾分之一。

  實現(xiàn)高度優(yōu)化的視頻編碼和解碼軟件需要徹底地理解本文介紹的目標(biāo)處理器的信號處理概念。大多數(shù)的視頻壓縮標(biāo)準(zhǔn)不會規(guī)定運動估計的方法。盡管基準(zhǔn)編碼器適合于大多數(shù)的標(biāo)準(zhǔn),深入了解視頻壓縮算法通常允許設(shè)計師利用更多成熟的運動估計方法,并獲得更好的結(jié)果。此外,全面理解信號處理原理,實現(xiàn)信號處理功能,以及了解目標(biāo)處理器的細(xì)節(jié)知識對于有效地將視頻壓縮算法中的各種任務(wù)對應(yīng)到處理器的結(jié)構(gòu)資源來說是非常重要的。

Berkeley設(shè)計技術(shù)公司



相關(guān)鏈接:
迪威汪倫:品牌并非國內(nèi)視頻廠商不可逾越的障礙 2008-05-30
揭密顯示屏幕背后的高清晰電視技術(shù) 2008-05-30
四招打造SMB視頻會議方案 2008-05-28
讓視頻會議多一些人工智能 2008-05-28
視頻會議系統(tǒng)應(yīng)用方案的比較 2008-05-28

分類信息: