<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于PC機的MPEG-4編碼原理研究及實(shí)現

基于PC機的MPEG-4編碼原理研究及實(shí)現

作者: 時(shí)間:2010-06-18 來(lái)源:網(wǎng)絡(luò ) 收藏

  0 引言

  隨著(zhù)多媒體業(yè)務(wù)的發(fā)展,日益增長(cháng)的多媒體通信量和有限的通信帶寬之間的矛盾日益突出。為了減小傳輸的數據量,國際電信聯(lián)盟和 MPEG標準組織都制定過(guò)各自的視頻壓縮標準。其中,最新標準以其高壓縮率,支持低碼率傳輸和基于對象編碼等優(yōu)點(diǎn),而在傳真、視頻點(diǎn)播、電視會(huì )議、醫用圖像傳輸等領(lǐng)域廣泛應用。

  繼承了MPEG-2中檔次和等級概念,共有視頻檔次、音頻檔次、圖形檔次和場(chǎng)景描述檔次共四類(lèi)。檔次是針對某一特定的應用而采用的編碼工具,它是提供的工具集中一個(gè)子集,不同的檔次就是不同的子集。每一個(gè)檔次分為一個(gè)或多個(gè)等級,等級則定義了比特流參數的規格,實(shí)際上是限定了解碼一個(gè)編碼序列所應具備的性能。

  MPEG-4的獨特之處在于支持基于內容的編解碼,為此引入了視聽(tīng)對象AVO(Audio/Video Object)的概念。AVO可以是一幅圖像中一個(gè)小提琴或琴聲等,每個(gè)AVO可獨立編碼,但相互之間又存在著(zhù)時(shí)空結構關(guān)系,因此編碼時(shí),必須傳送編碼對象的組成結構信息體“場(chǎng)景描述”,以表示場(chǎng)景中各AVO之間的時(shí)空結構關(guān)系。解碼時(shí)根據此“場(chǎng)景描述”對圖像和聲音的有關(guān)內容進(jìn)行編輯和操作。視聽(tīng)對象還可以是一個(gè)矩形幀,從而使MPEG-4兼容原來(lái)的MPEG標準。視聽(tīng)對象中的視頻對象VO通常由3類(lèi)信息來(lái)描述,即運動(dòng)、形狀和紋理信息。

  1 編碼原理

  MPEG-4主要由形狀編碼、紋理編碼和運動(dòng)編碼三部分組成。幀格式分為I-VoP,P-VOP和B-VOP。這里只討論I-VOP和P-VOP。I-VOP采用紋理編碼來(lái)消除一幀圖像數據間的空間冗余度;P-VOP是參考前一幀圖像,并采用兩種參數來(lái)編碼。一種是當前要編碼的圖像與參考圖像之間的差值;另一種是運動(dòng)矢量。的具體結構模塊如圖1所示。

編碼器的具體結構模塊

  1.1 形狀編碼

  形狀編碼主要用于記錄從圖像序列中提取VOP的形狀信息,該信息分為二值形狀信息和灰度形狀信息。二值形狀信息用0和1兩個(gè)值表示VOP的形狀;灰度形狀信息用0~255表示VOP區域的不同透明度。在編碼時(shí),當提取的VOP具有非矩形形狀時(shí),需要對其進(jìn)行邊界擴展,使其矩形邊界都是16的倍數,同時(shí)保證擴展后的面積最小,然后進(jìn)行形狀編碼;當提取的 VOP為矩形時(shí)(矩形的長(cháng)度和寬度都是16的倍數),形狀編碼就會(huì )被屏蔽。

  1.2 紋理編碼

  紋理編碼主要對I-VOP內的圖像像素或P-VOP內的差值像素進(jìn)行編碼,包括DCT、量化、、熵編碼等過(guò)程,最大程度地去除當前VOP內各像素之間的空間冗余度。

  視頻的第一幀圖像采用I-VOP格式編碼,其余的幀采用I-VOP,還是P-VOP格式則受兩個(gè)因素制約。其用戶(hù)會(huì )按照IPPPIPPPI的方式設置當前幀所采用的格式;二是已經(jīng)人為地設置了當前幀為P-VOP,通過(guò)運動(dòng)估計計算mad_P的值,如果mad_P滿(mǎn)足下列兩個(gè)條件之一,則當前幀就采用P- VOP編碼格式,否則采用I-VOP編碼格式。

  條件1:mad P50/3;

  條件2:mad P50,并且IntraMBRatio0.4。其中,IntraMBRatio為當前幀中采用MBM_INTRA預測模式的宏塊占總宏塊的比重。

  紋理編碼中的DCT和量化模塊比較簡(jiǎn)單,這里略過(guò),重點(diǎn)介紹剩下的紋理編碼模塊。

  1.2.1

  8×8 塊經(jīng)過(guò)DCT和量化后,系數排列呈現以下的規律,即非零系數集中在左上角,大部分的0系數集中在偏離DC系數向右和向下的位置上。特別是DC系數、第一行和第一列AC系數,數值非零且較大,如果能用較小的數值代替它們,會(huì )減少編碼后的位流數,于是產(chǎn)生。

  在MPEG-4中,通常把一個(gè)宏塊分為6個(gè)8×8塊進(jìn)行DC和AC預測。

  首先對8×8塊進(jìn)行DC預測。如圖2所示,X表示當前的8×8塊;A,B和C表示X的相鄰8×8塊,其位置分別位于X的左邊、左上角和上邊。對X進(jìn)行DC預測就是采用相鄰塊的DC系數值預測X的DC系數值,關(guān)鍵是選擇哪個(gè)相鄰塊的DC系數。

DC預測  

  程序采用了以下策略選取相鄰塊。定義塊A,B,C,X的DC系數值分別為 DC_A,DC_B,DC_C,DC_X。

  如果DC_A與DC_B的差小于DC_B與DC_C的差,則DC_A與DC_B在數值上比較接近,即在垂直方向上的數值比水平方向上更接近,所以采用DC_C來(lái)預測DC_X;反之,在水平方向的數值比較接近,即采用DC_A來(lái)預測DC_X。

  將當前塊的DC系數與用來(lái)預測的相鄰塊的DC系數,經(jīng)過(guò)特定處理后做差,其差存放到當前塊的DC位置上,同時(shí)記錄此DC系數的預測方向。

  AC 預測主要是針對8×8塊的第一行或者第一列AC系數,其預測方向取決于當前塊DC系數的預測方向。如圖2所示,如果之前DC預測為水平預測,則當前塊X的第一列AC系數采用A塊的第一列AC系數預測,同時(shí)將X的第一列7個(gè)AC系數各自取絕對值后相加到變量S1(S1的初始值為0)上。將當前塊第一列AC系數與用來(lái)預測的相鄰塊A的第一列AC系數做差,其7個(gè)差值存放到當前塊的第一列AC系數的位置上,同時(shí)將7個(gè)差值各自取絕對值后相加到變量S2(S2的初始值為0)上。如果之前的DC預測為垂直預測,則只進(jìn)行當前塊X的第一行AC系數預測,其預測步驟同第一列AC系數的預測一樣。

  有時(shí)AC 預測會(huì )產(chǎn)生較大的預測誤差,并沒(méi)有達到節省位流的目的,因此必須判斷AC預測的有效性。在單個(gè)8×8小塊的AC預測中,用S1記錄了此小塊的第一行或第一列AC系數的絕對值之和,用S2記錄了第一行或第一列預測后7個(gè)差值的絕對和。以一個(gè)宏塊的6個(gè)8×8小塊為單位,將各個(gè)小塊的S1與S2之差相加,得到值S。如果S非零,則此宏塊進(jìn)行AC預測,其標志ACpred_flag置1,否則此宏塊不進(jìn)行AC預測,ACpred_flag置0。

  1.2.2 之字型掃描

  DC和AC預測之后,對8×8塊的系數進(jìn)行之字形掃描,共有Zigzag,Zigzag_v(交替垂直掃描)和 Zigzag_h(交替水平掃描)三種掃描方式。采用何種掃描方式由三個(gè)要素決定,即幀內還是幀間預測,AC預測標志ACpred_flag的值,DC系數的預測方向。

  對于幀內預測的宏塊,如果AC預測標志ACpredflag為0,則此宏塊中的6個(gè)8×8塊都使用Zigzag掃描;如果 AC預測標志為1,則此宏塊中的6個(gè)8×8塊將根據各自的DC預測方向決定AC系數的掃描方向。如果DC預測為水平預測,則此8×8塊使用 Zigzag_v掃描方式掃描系數,否則使用Zigzag_h掃描方式。

  對于幀間預測的宏塊,其每個(gè)8×8塊統一采用Zigzag掃描方式掃描系數。

  8×8的系數矩陣經(jīng)過(guò)之字型掃描后,大部分非零系數集中在一個(gè)一維數組的前部,大部分零系數集中在此一維數組的后面,根據此特點(diǎn)便產(chǎn)生了游程編碼。

  1.2.3 游程編碼和熵編碼

  所謂游程編碼就是對8×8系數矩陣的AC系數進(jìn)行特定的處理,使其成為個(gè)數更少的三維矢量(Last,Run,Level)。其中,Level代表非0系數的大小。Run代表Level前面連續0的個(gè)數。Last代表終止標志:其值為0時(shí),表示Level后還有不為0的系數;其值為1時(shí)表示該系數是最后不為0的數;余下的系數全為0。游程編碼生成三維矢量,壓縮了數據量,然后根據Last,Run和Level的不同組合作為索引,找到對應Huffman編碼表中的碼字,生成碼流。

  1.3 運動(dòng)編碼

  運動(dòng)編碼對當前P-VOP和參考VOP進(jìn)行,減小幀間的時(shí)間相關(guān)性,實(shí)現壓縮。

  通常采用塊匹配法進(jìn)行運動(dòng)估計。塊匹配法就是針對當前幀中某一特定大小的圖像塊,從參考幀的一定區域中找出該圖像塊絕對誤差和(Sum of AbsoluteDifference,SAD)的最小匹配塊,利用此匹配塊來(lái)預測當前塊。圖像塊的絕對誤差和指兩個(gè)大小相同的圖像塊的中像素差的絕對值之和。SAD16×16函數實(shí)現當前宏塊和參考宏塊間的絕對誤差和;SAD8×8函數實(shí)現當前8×8塊與參考8×8塊間的絕對誤差和。

  確定了塊匹配準則后,就要進(jìn)行最優(yōu)匹配點(diǎn)的搜索,MPEG-4校驗模型最后采用鉆石搜索法(Diamond Search,DS)。鉆石搜索法是一種利用搜索模板的形狀和大小,對運動(dòng)估計算法速度及精度產(chǎn)生重要影響的快速搜索法。選用了兩種形狀和大小都不相同的搜索模板:一種是大鉆石搜索模板(Large DiamondSearch Pattern,LDSP),它有9個(gè)候選位置:(0,0),(0,2),(1,1),(2,0),(1,-1),(0,-2),(-1,-1), (-2,0)和(-1,1)。具體模板如圖3所示。一種是小鉆石搜索模板(Small Diamond Search Pattern,SDSP),它包含5個(gè)候選位置:(0,0),(0,1),(1,0),(0,-1)和(-1,0)。具體模板如圖4所示。

具體模板

  鉆石搜索過(guò)程如下:以當前幀的當前宏塊的左上角起點(diǎn)坐標為大模板的原點(diǎn) (0,0),在參考幀的搜索范圍內,分別以大模板的(0,0),(0,2),(1,1),(2,0),(1,-1),(0,-2),(-1,-1), (-2,0)和(-1,1)像素點(diǎn)作為宏塊的左上角起點(diǎn),將該宏塊和當前幀的宏塊做SAD16×16運算,選擇SAD16×16值最小的左上角起點(diǎn)作為暫時(shí)的最佳匹配點(diǎn),此點(diǎn)與當前宏塊左上角起點(diǎn)之間的位移就是運動(dòng)矢量。判斷此運動(dòng)矢量是否適合特定的規則,如果不適合,則進(jìn)行新一輪的大鉆石模板搜索,直到找到適合條件的運動(dòng)矢量。然后再以大鉆石模板搜索的最佳匹配點(diǎn)為中心點(diǎn)(0,0),用小鉆石搜索模板進(jìn)行(0,1),(1,0),(0,-1)和 (-1,0)四個(gè)參考點(diǎn)的精確搜索,搜索到的SAD16×16值最小點(diǎn)就是最終的最佳匹配點(diǎn),最佳匹配點(diǎn)與當前宏塊的左上角起點(diǎn)之間的位移就是最終的運動(dòng)矢量。

  以上是基于宏塊的全像素搜索,還可以選擇是否進(jìn)行基于8×8塊的全像素搜索。利用已經(jīng)得到的基于宏塊的運動(dòng)矢量,找到基于宏塊的最佳匹配點(diǎn)。此匹配點(diǎn)為中心(0,0),其他匹配點(diǎn)為(-1,-1),(0,-1),(1,-1),(-1,0),(1,0),(-1,1),(0,1), (1,1),分別以這9個(gè)匹配點(diǎn)作為8×8像素塊的左上角起點(diǎn),將該8×8塊和當前幀的8×8塊做絕對差值和的運算,選擇SAD8×8值最小的左上角起點(diǎn)作為最佳匹配點(diǎn),以找到最佳運動(dòng)矢量,得到宏塊內每個(gè)8×8亮度塊的運動(dòng)矢量和SAD8×8值。將4個(gè)SAD8×8的和與SAD16×16做比較,將較小值按照一定的規則處理,從而判斷當前宏塊的預測模式為幀內或幀間預測。

  如果采用幀間預測,進(jìn)一步采用半像素搜索。首先對整個(gè)參考幀進(jìn)行雙線(xiàn)性差值,則參考幀的面積變?yōu)樵瓉?lái)的4倍,然后在特定的搜索范圍內搜索出更精確的運動(dòng)矢量,最后根據參考圖像的亮度信息、色度信息和運動(dòng)矢量做運動(dòng)補償。

  如果采用幀內預測,不再對當前宏塊進(jìn)行任何運動(dòng)估計,相應運動(dòng)補償后的參考宏塊數值為0。

  最后用當前幀減去運動(dòng)補償后參考圖像得到差值,將差值數據進(jìn)行紋理編碼;對每個(gè)宏塊的運動(dòng)矢量進(jìn)行預測并求出差分值,對差分值進(jìn)行位流轉換并輸出。

  2 的實(shí)現和測試

  根據圖1并結合MPEG-4編碼器各個(gè)模塊的實(shí)現原理,進(jìn)行編碼器主函數的編寫(xiě)和調試。初步確定編碼器的主函數應包括以下三部分:

  初始化部分由于參考代碼中存在RGB到YUV的圖像格式轉換函數(本文未介紹),則應開(kāi)辟相應的存儲BMP和YUV圖像的空間;還要開(kāi)辟空間存放編碼器生成的壓縮文件;必須設置編碼器的編碼參數。

  編碼處理部分此部分是通過(guò)循環(huán)編碼各幀圖像來(lái)實(shí)現的,讀入一幀圖像后,判斷是采用I幀還是P幀,然后輸出VOP頭信息,進(jìn)行當前VOP的編碼并輸出位流信息到緩沖器中,最后利用fwrite函數形成磁盤(pán)文件。

  釋放資源前面兩個(gè)階段開(kāi)辟的內存空間必須釋放掉,整個(gè)視頻的編碼過(guò)程結束。

  結合參考的編碼主函數,調試并運行編碼器,生成divx文件,相應地調試出解碼器。逐一更改編碼器的量化參數QP、幀率、輸出碼率和I幀間隔參數,測試出它們對編碼效果的影響,如量化參數QP、幀率和I幀間隔參數與壓縮比成正比,輸出碼率與壓縮比成反比。經(jīng)過(guò)綜合測試,在保證解碼圖像質(zhì)量的前提下,當QP為8,幀率為30 f/s,輸出碼率為400 000 b/s,I幀間隔為3時(shí),壓縮比為58.8,此時(shí)達到最好的壓縮效果。當然,如果對解壓后的視覺(jué)效果要求不高的話(huà),壓縮倍數還可以繼續提高。

  3 結語(yǔ)

  所講的MPEG-4是MPEG-4標準的Part2部分,其編解碼器已經(jīng)獲得了許多廠(chǎng)商的支持。目前,作為MPEG-4 Part10的H.264也已經(jīng)推出并發(fā)展,相比MPEG-4 Part2,H.264在同樣質(zhì)量下,其碼率能降低50%左右,說(shuō)明MPEG-4一直在發(fā)展。隨著(zhù)基于內容的編碼技術(shù)的實(shí)用化發(fā)展,MPEG-4將有更為廣泛的應用前景。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>