專利名稱:基于低內存消耗查詢表的視頻壓縮碼率控制方法
技術領域:
本發明涉及視頻傳輸控制相關的多媒體技術領域,特別是涉及一種基于低內存消耗查詢表的視頻壓縮碼率控制方法。
背景技術:
在視頻的實時通信中,壓縮后的視頻碼流需要在一個復雜且有不同帶寬要求的網絡上進行傳輸。為了在任何時候都能最高效地利用網絡資源,并且保證相對較高的視頻圖像質量,就需要對視頻流的碼率進行控制。如果視頻編碼后產生的碼流碼率過高,則會加重網絡的傳輸壓力,造成網絡阻塞;另一方面,如果碼流在產生的過程中碼率發生降低,則會降低視頻圖像的質量,并造成對網絡帶寬的不充分利用。因此,需要在視頻壓縮過程中引入碼率控制,用來在視頻網絡傳輸時控制和調整編碼端輸出的碼流,滿足網絡帶寬的要求,同時保證一定的視頻質量。
目前最簡單有效的碼率控制方法是基于調節量化參數值QP來進行的,這一類的經典方法主要是通過構建出一個率失真數學模型來確定QP值。然而,這些方法存在以下幾個問題1)率失真模型建立在對離散余弦變換的系數等原始信息概率學假設的基礎上,該種假設會導致碼率控制的偏差。
2)率失真模型一般都和殘差宏塊的方差有關。然而,在視頻編碼過程中,為了降低計算復雜度,被使用的常常是絕對誤差和SAD而不是方差。因此,基于方差的率失真模型就必須得修改,這是一種啟發式的修改,通常依賴于圖像特征,效果不一定會好。
3)在率失真模型中,QP值的確定一般是通過最優化方法,例如拉格朗日乘數法來計算得到的。但是,在H.263、MPEG-4等標準中,相鄰塊的QP值之差會被限定在[-2,2]之中,以防相鄰塊之間大的質量波動,這樣的限制削弱了最優化方法所帶來的優勢,因而模型對比特數的估計會帶來偏差,視頻質量也會隨之下降。
4)率失真模型引入了大量復雜的浮點運算,計算復雜度急劇上升,也增大了硬件實現的代價。
如果能針對上述問題發掘一些改進的碼率控制方法,將能降低計算復雜度,提高碼率估計精確度,并且增強對圖像特征變化的適應性。
發明內容
本發明的目的在于提供一種基于低內存消耗查詢表的視頻壓縮碼率控制方法。
本發明解決其技術問題所采用的技術方案如下一種基于低內存消耗查詢表的視頻壓縮碼率控制方法應用對象為前向預測幀P幀,本方法首先執行碼率控制方法的預處理過程;然后對每個P幀分配比特數;接下來給P幀中每一宏塊分配比特數,其中使用了低內存消耗查詢表;在完成當前宏塊編碼后,需要記錄更新值。
1)在碼率控制方法的預處理過程中,根據宏塊的量化參數值QP、絕對誤差和、以及編碼宏塊紋理信息所用的比特數,簡稱為紋理比特數,來構建一張碼率查詢表b[QP][SAD_SEG_NO];絕對誤差和的計算如公式(1)所示SAD=Σi=015Σj=015|f(i,j)-g(i,j)|---(1)]]>其中SAD是絕對誤差和,f是當前幀的像素函數,g為前一幀的像素函數;碼率查詢表b[QP][SAD_SEG_NO]中的SAD_SEG_NO表示SAD段的序號;根據一個QP值和SAD_SEG_NO值,就可查表求得紋理比特數b;查詢表的具體構建方式如下對于每一個特定的QP值,通常從1到31,利用所用的視頻編碼器來編碼大量的視頻序列;對于有相同SAD的宏塊,計算出宏塊的平均紋理比特數;在執行完這些之后,SAD和紋理比特數的關系就建立起來了,根據結果可以發現,SAD和紋理比特數的關系可以通過分段線性函數來模擬;因此,為了減少查詢表的存儲消耗,采用間隔選取SAD值的方法,間隔值表示為SAD_STEP;查詢表二維數組中第二個參數SAD_SEG_NO即表示SAD段的序號(SAD_SEG_NO=_SAD/SAD_STEP_,__表示取小于該數的最大整數),b[QP][SAD_SEG_NO]表示SAD等于SAD_SEG_NO×SAD_STEP的宏塊的平均紋理比特數;在每個SAD段內,SAD和紋理比特數的關系由一個線性函數來模擬,因此記錄下SAD段的兩個端點的值就足夠了;此外,SAD的取值范圍設定為0至4000;2)在對每個P幀分配比特數過程中,假設所分配到當前P幀的目標比特數為Btar_p,具體分配方法可參照H.263參考模型TMN8或是MPEG-4參考模型VM7所采用的幀目標比特數分配方法來做;接著將當前P幀做完運動估計之后的殘差宏塊分成兩大類非零宏塊,即SAD大于某個預先設定的閥值,量化后極有可能存在非零系數的宏塊;全零宏塊,即SAD小于該閥值的,量化后極有可能是系數全零的宏塊;后者無需進行編碼;在本發明的描述中,默認情況下,宏塊均指代非零宏塊;考慮當前P幀中的第k個宏塊,所要分配給第k個宏塊的目標紋理比特數btar_k按公式(2)計算btar_k=Btex_rem×SADk/Σi=kNSADi---(2)]]>其中Btex_rem表示當前剩余的用來編碼剩余宏塊紋理信息的比特數,SADk表示第k個宏塊的SAD值,N表示當前幀中所有非零宏塊個數,Btex_rem通過公式(3)計算Btex_rem=Brem-Buncode-Bheader-bh-intra‾×Nintra-bh-inter‾×Ninter---(3)]]>其中Brem表示當前剩余的用于編碼剩余宏塊所有信息的比特數,初始值設為當前P幀的目標比特數Btar_p,Buncode表示用于編碼全零宏塊中非紋理信息的比特數,Bheader表示用于編碼幀的頭信息的比特數, 表示用于編碼采用幀內編碼模式(intra)的宏塊頭信息的平均比特數,根據當前幀中已編碼的intra宏塊所花的平均頭信息比特數來估計, 表示用于編碼采用幀間編碼模式(inter)的宏塊頭信息的平均比特數,根據當前幀中已編碼的inter宏塊所花的平均頭信息比特數來估計,Nintra表示當前幀中剩余intra宏塊的數量,Ninter表示當前幀中剩余inter宏塊的數量;3)在給P幀中每一宏塊分配比特數過程中,分配好第k個宏塊目標紋理比特數btar_k后,假設第k個宏塊通過運動估計所得到的SAD值為SADk,可根據碼率查詢表來計算出合適的QP值,使得宏塊在用該QP值編碼后產生的實際紋理比特數最接近btar_k;詳細步驟如下所示第一步確定QP的搜索范圍為了減少相鄰幀之間的質量波動,QP的搜索范圍需要被限制;假設編碼前一個P幀所有宏塊的平均QP值為 則當前幀宏塊QP的搜索范圍被限制在[max{QPprev‾-2,1},min{QPprev‾+2,31];]]>需要注意的是,如果當前幀為視頻序列中的第一個P幀,則當前幀的搜索范圍仍然為[1,31];第二步確定SAD段宏塊的SADk落在SAD段[SADm,SADn]內,其中SADm等于SAD_STEP×_SADk/SAD_STEP_,SADn等于SADm+SAD_STEP;第三步對于每個QP值,估計出紋理比特數對于搜索范圍內的每個QP值,需要估計出紋理比特數bQP;bQP通過查表并插值獲得;插值計算如公式(4)所示bQP=(bn-bm)×(SADk-SADm)/SAD_STEP+bm(4)其中bm表示b[QP][SADm/SAD_STEP],bn表示b[QP][SADn/SAD_STEP];第四步選擇合適的QP值在計算出每個QP的bQP值后,要選擇一個合適的QP值;所選擇出的QP值所對應的bQP和宏塊目標紋理比特數btar_k之差最小(min{|bQP-btar_k|});第五步調整QP值上面選擇出的QP需要進一步調整;例如,在MPEG-4和H.263中,水平相鄰宏塊的QP值之差被限制在[-2,2];4)在完成當前宏塊編碼后,需要記錄更新值;但對碼率查詢表的真正更新是在編完整幀之后做,以便降低計算復雜度,并保證較高準確度的更新;整個過程如下首先額外構建兩張表,一張是更新表,定義為Δb[QP][SAD_SEG_NO],用來記錄更新值;一張是計數表,定義為C[QP][SAD_SEG_NO],用來計數;更新表和計數表均初始化為0(實際應用中,兩張表的尺寸可以減小;考慮最大可能的更新范圍,每張表的尺寸可減小為5×(_SADmax/SAD_STEP_-_SADmin/SAD_STEP_+2),其中,5代表QP搜索范圍內所有QP值的個數;SADmax和SADmin分別表示當前幀中所有宏塊SAD的最大值和最小值;(_SADmax/SAD_STEP_-_SADmin/SAD_STEP_+2)表示對于某個QP值所有可能更新值的個數);對于SAD值為SADk的第k個宏塊,在用選擇出的QP值編碼完后,實際產生的紋理比特數是bact_k;通過對碼率查詢表插值估計得到的紋理比特數為bQP;則更新值被定義為u=(bact_k-bQP)/2;在編碼完每個宏塊后,都需按以下操作記錄更新值,假設SADk落在SAD段[SADm,SADn]內如果SADk-SADm<SAD_STEP/4,則按公式(5)和(6)進行記錄Δb[QP][SADm/SAD_STEP]=Δb[QP][SADm/SAD_STEP]+u(5)C[QP][SADm/SAD_STEP]=C[QP][SADm/SAD_STEP]+1(6)如果SADn-SADk<SAD_STEP/4,則按公式(7)和(8)進行記錄Δb[QP][SADn/SAD_STEP]=Δb[QP][SADn/SAD_STEP]+u(7)C[QP][SADn/SAD_STEP]=C[QP][SADn/SAD_STEP]+1(8)其他情況下,則將公式(5)至公式(8)均執行一遍進行記錄;在編碼完整幀后,對于在更新表中已改變的值(即相應的C[QP][SAD_SEG_NO]為非零),Δb[QP][SAD_SEG_NO]要被重新計算,如公式(9)所示Δb[QP][SAD_SEG_NO]=Δb[QP][SAD_SEG_NO]/C[QP][SAD_SEG_NO](9)在做完公式(9)的操作后就得到了最終的更新表,該更新表就被用來更新碼率查詢表中相對應位置的元素,具體按公式(10)進行更新b[QP][SAD_SEG_NO]=b[QP][SAD_SEG_NO]+Δb[QP][SAD_SEG_NO] (10)在編碼下一幀之前,更新表和計數表需要重新清零。
發明與背景技術相比,具有的有益的效果是本發明是一種內存消耗低、碼率估計精確度高的碼率控制方法。該方法可用于H.263,MPEG-4和H.264等多種視頻壓縮標準,并且結合碼率控制中不同的幀目標比特數分配方式,可以適用于各種應用場景,如視頻會議、視頻電話等低時延應用,網絡電視、視頻監控等對圖像質量要求較高的應用。比起傳統的基于率失真數學模型構建的碼率控制方法,基于低內存消耗查詢表的方法有效地提高了視頻質量,對碼率和跳幀現象的發生也進行了更好的控制。
具體實施例方式
本發明提出的基于低內存消耗查詢表的視頻壓縮碼率控制方法是對傳統基于率失真模型方法的一種改進。主要按如下步驟進行1.碼率控制的預處理過程構建出碼率查詢表。
2.碼率控制實際執行過程對于每個P幀1)參照H.263參考模型TMN8或是MPEG-4參考模型VM7所采用的跳幀控制方法,進行跳幀控制,如果當前幀未被跳過,則進入第2步;否則進入下一幀編碼;2)對當前P幀中所有宏塊進行運動估計和運動補償。記錄下每個宏塊的運動矢量信息和SAD值,并將宏塊分成非零宏塊和全零宏塊兩種,非零宏塊被進一步分成intra和inter編碼模式的宏塊;3)參照H.263參考模型TMN8或是MPEG-4參考模型VM7所采用的幀目標比特數分配方法,分配給當前P幀一個目標比特數Btar_p;4)完成對每個宏塊進行目標比特數分配的前期準備工作計算Buncode,Bheader,Nintra和Ninter;設置Brem=Btar_p,bh-intra‾=0,]]>bh-inter‾=0;]]>5)對于每一個非零宏塊(假設當前是第k個宏塊)a)利用公式(3)計算Btex_rem,b)利用公式(2)計算宏塊的目標紋理比特數btar_k,c)根據碼率查詢表計算出宏塊的QP值,d)對宏塊進行實際編碼,e)計算出宏塊實際的紋理比特數bact_k,并記錄更新值u,f)計算出實際編碼宏塊頭信息的比特數bhd_k,宏塊如果采用intra編碼模式,則更新 如果采用inter編碼模式,則更新 g)宏塊如果采用intra編碼模式,則將Nintra減1,如果采用inter編碼模式,則將Ninter減1,h)更新Brem,更新公式為Brem=Brem-(bact_k+bhd_k);6)更新碼率查詢表。
本發明已在目前通用的H.263編碼器上測試通過,該編碼器采用了H.263中如下技術1)參考幀個數1個;2)視頻序列編碼類型頭一幀為I幀,后續幀均為P幀;3)整像素運動估計范圍[-16,+16]像素范圍;4)運動估計模式16×16像素塊模式、8×8像素塊模式;5)運動矢量整像素全搜索方式,支持非限制運動矢量搜索;6)編碼幀率為10幀每秒;
7)頭一個I幀以QP值13進行編碼。
本發明方法的試驗結果表明用foreman,mthr_dotr,news,suzie等一系列176×144像素格式的視頻序列進行測試,結果顯示,本發明方法在碼率控制、視頻質量的提高等方面均表現出良好的效果,同時有效控制了跳幀現象的發生。
權利要求
1.一種基于低內存消耗查詢表的視頻壓縮碼率控制方法,其特征在于應用對象為前向預測幀P幀,本方法首先執行碼率控制方法的預處理過程;然后對每個P幀分配比特數;接下來給P幀中每一宏塊分配比特數,其中使用了低內存消耗查詢表;在完成當前宏塊編碼后,需要記錄更新值。
2.根據權利要求1所述的一種基于低內存消耗查詢表的視頻壓縮碼率控制方法,其特征在于1)在碼率控制方法的預處理過程中,根據宏塊的量化參數值QP、絕對誤差和、以及編碼宏塊紋理信息所用的比特數,簡稱為紋理比特數,來構建一張碼率查詢表b[QP][SAD_SEG_NO];絕對誤差和的計算如公式(1)所示SAD=Σi=015Σj=015|f(i,j)-g(i,j)|---(1)]]>其中SAD是絕對誤差和,f是當前幀的像素函數,g為前一幀的像素函數;碼率查詢表b[QP][SAD_SEG_NO]中的SAD_SEG_NO表示SAD段的序號;根據一個QP值和SAD_SEG_NO值,就可查表求得紋理比特數b;查詢表的具體構建方式如下對于每一個特定的QP值,通常從1到31,利用所用的視頻編碼器來編碼大量的視頻序列;對于有相同SAD的宏塊,計算出宏塊的平均紋理比特數;在執行完這些之后,SAD和紋理比特數的關系就建立起來了,根據結果可以發現,SAD和紋理比特數的關系可以通過分段線性函數來模擬;因此,為了減少查詢表的存儲消耗,采用間隔選取SAD值的方法,間隔值表示為SAD_STEP;查詢表二維數組中第二個參數SAD_SEG_NO即表示SAD段的序號(SAD_SEG_NO=_SAD/SAD_STEP_,__表示取小于該數的最大整數),b[QP][SAD_SEG_NO]表示SAD等于SAD_SEG_NO×SAD_STEP的宏塊的平均紋理比特數;在每個SAD段內,SAD和紋理比特數的關系由一個線性函數來模擬,因此記錄下SAD段的兩個端點的值就足夠了;此外,SAD的取值范圍設定為0至4000;2)在對每個P幀分配比特數過程中,假設所分配到當前P幀的目標比特數為Btar_p,具體分配方法可參照H.263參考模型TMN8或是MPEG-4參考模型VM7所采用的幀目標比特數分配方法來做;接著將當前P幀做完運動估計之后的殘差宏塊分成兩大類非零宏塊,即SAD大于某個預先設定的閥值,量化后極有可能存在非零系數的宏塊;全零宏塊,即SAD小于該閥值的,量化后極有可能是系數全零的宏塊;后者無需進行編碼;在本發明的描述中,默認情況下,宏塊均指代非零宏塊;考慮當前P幀中的第k個宏塊,所要分配給第k個宏塊的目標紋理比特數btar_k按公式(2)計算btar_k=Btex_rem×SADk/Σi=kNSADi---(2)]]>其中Btex_rem表示當前剩余的用來編碼剩余宏塊紋理信息的比特數,SADk表示第k個宏塊的SAD值,N表示當前幀中所有非零宏塊個數,Btex_rem通過公式(3)計算Btex_rem=Brem-Buncode-Bheader-bh-intra‾×Nintra-bh-inter‾×Ninter---(3)]]>其中Brem表示當前剩余的用于編碼剩余宏塊所有信息的比特數,初始值設為當前P幀的目標比特數Btar_p,Buncode表示用于編碼全零宏塊中非紋理信息的比特數,Bheader表示用于編碼幀的頭信息的比特數, 表示用于編碼采用幀內編碼模式(intra)的宏塊頭信息的平均比特數,根據當前幀中已編碼的intra宏塊所花的平均頭信息比特數來估計, 表示用于編碼采用幀間編碼模式(inter)的宏塊頭信息的平均比特數,根據當前幀中已編碼的inter宏塊所花的平均頭信息比特數來估計,Nintra表示當前幀中剩余intra宏塊的數量,Ninter表示當前幀中剩余inter宏塊的數量;3)在給P幀中每一宏塊分配比特數過程中,分配好第k個宏塊目標紋理比特數btar_k后,假設第k個宏塊通過運動估計所得到的SAD值為SADk,可根據碼率查詢表來計算出合適的QP值,使得宏塊在用該QP值編碼后產生的實際紋理比特數最接近btar_k;詳細步驟如下所示第一步確定QP的搜索范圍為了減少相鄰幀之間的質量波動,QP的搜索范圍需要被限制;假設編碼前一個P幀所有宏塊的平均QP值為 則當前幀宏塊QP的搜索范圍被限制在 需要注意的是,如果當前幀為視頻序列中的第一個P幀,則當前幀的搜索范圍仍然為[1,31];第二步確定SAD段宏塊的SADk落在SAD段[SADm,SADn]內,其中SADm等于SAD_STEP×_SADk/SAD_STEP_,SADn等于SADm+SAD_STEP;第三步對于每個QP值,估計出紋理比特數對于搜索范圍內的每個QP值,需要估計出紋理比特數bQP;bQP通過查表并插值獲得;插值計算如公式(4)所示bQP=(bn-bm)×(SADk-SADm)/SAD_STEP+bm(4)其中bm表不b[QP][SADm/SAD_STEP],bn表不b[QP][SADn/SAD_STEP];第四步選擇合適的QP值在計算出每個QP的bQP值后,要選擇一個合適的QP值;所選擇出的QP值所對應的bQP和宏塊目標紋理比特數btar_k之差最小(min{|bQP-btar_k|});第五步調整QP值上面選擇出的QP需要進一步調整;例如,在MPEG-4和H.263中,水平相鄰宏塊的QP值之差被限制在[-2,2];4)在完成當前宏塊編碼后,需要記錄更新值;但對碼率查詢表的真正更新是在編完整幀之后做,以便降低計算復雜度,并保證較高準確度的更新;整個過程如下首先額外構建兩張表,一張是更新表,定義為Δb[QP][SAD_SEG_NO],用來記錄更新值;一張是計數表,定義為C[QP][SAD_SEG_NO],用來計數;更新表和計數表均初始化為0(實際應用中,兩張表的尺寸可以減小;考慮最大可能的更新范圍,每張表的尺寸可減小為5×(_SADmax/SAD_STEP_-_SADmin/SAD_STEP_+2),其中,5代表QP搜索范圍內所有QP值的個數;SADmax和SADmin分別表示當前幀中所有宏塊SAD的最大值和最小值;(_SADmax/SAD_STEP_-_SADmin/SAD_STEP_+2)表示對于某個QP值所有可能更新值的個數);對于SAD值為SADk的第k個宏塊,在用選擇出的QP值編碼完后,實際產生的紋理比特數是bact_k;通過對碼率查詢表插值估計得到的紋理比特數為bQP;則更新值被定義為u=(bact_k-bQP)/2;在編碼完每個宏塊后,都需按以下操作記錄更新值,假設SADk落在SAD段[SADm,DADn]內如果SADk-SADm<SAD_STEP/4,則按公式(5)和(6)進行記錄Δb[QP][SADm/SAD_STEP]=Δb[QP][SADm/SAD_STEP]+u(5)C[QP][SADm/SAD_STEP]=C[QP][SADm/SAD_STEP]+1(6)如果SADn-SADk<SAD_STEP/4,則按公式(7)和(8)進行記錄Δb[QP][SADn/SAD_STEP]=Δb[QP][SADn/SAD_STEP]+u(7)C[QP][SADn/SAD_STEP]=C[QP][SADn/SAD_STEP]+1(8)其他情況下,則將公式(5)至公式(8)均執行一遍進行記錄;在編碼完整幀后,對于在更新表中已改變的值(即相應的C[QP][SAD_SEG_NO]為非零),Δb[QP][SAD_SEG_NO]要被重新計算,如公式(9)所示Δb[QP][SAD_SEG_NO]=Δb[QP][SAD_SEG_NO]/C[QP][SAD_SEG_NO](9)在做完公式(9)的操作后就得到了最終的更新表,該更新表就被用來更新碼率查詢表中相對應位置的元素,具體按公式(10)進行更新b[QP][SAD_SEG_NO]=b[QP][SAD_SEG_NO]+Δb[QP][SAD_SEG_NO](10)在編碼下一幀之前,更新表和計數表需要重新清零。
全文摘要
本發明公開了一種基于低內存消耗查詢表的視頻壓縮碼率控制方法。首先執行碼率控制方法的預處理過程;然后對每個P幀分配比特數;接下來給P幀中每一宏塊分配比特數,其中使用了低內存消耗查詢表;在完成當前宏塊編碼后,需要記錄更新值。該方法可用于H.263,MPEG-4和H.264等多種視頻壓縮標準,并且結合碼率控制中不同的幀目標比特數分配方式,可以適用于各種應用場景,如視頻會議、視頻電話等低時延應用,網絡電視、視頻監控等對圖像質量要求較高的應用。比起傳統的基于率失真數學模型構建的碼率控制方法,基于低內存消耗查詢表的方法有效地提高了視頻質量,對碼率和跳幀現象的發生也進行了更好的控制。
文檔編號H04N7/32GK1917646SQ20061005281
公開日2007年2月21日 申請日期2006年8月7日 優先權日2006年8月7日
發明者陳純, 卜佳俊, 莫林劍, 楊智, 趙夢 申請人:浙江大學