X264的調試與移植


今年9月份接手了關於無線視頻傳輸的項目,我主要負責H.264部分。由於H.264採用了分層設計、多模式運動估計、改進的幀內預測等技術,顯著提高了預測精度,從而獲得比其他標準好得多的壓縮性能。然而H.264獲得優越性能的代價是大幅度增加計算複雜度。而對於我們使用的ARM9,處理能力有限,所以選用X264來進行視頻的處理壓縮

    網上自由組織聯合開發的兼容264標準碼流的編碼器,創始人是一個法國人。X264最大的特點在於其出發點是爲了H.264的實用性。與JM相比,X264並沒有完整的對H.264標準給與實現,而是捨去了一些對編碼性能貢獻很小但計算複雜度極高的新特性,如多參考幀、幀間預測中不必要的塊模式等技術。從而計算複雜度降低,編碼效率卻並沒有明顯降低。碼流兼容H.264。在實用的系統中,比如比較普遍的在DSP芯片上實現H.264,大多是移植X264代碼。

    到09年12月份,我所進行的X264工作,已經實現了在開發板、Linux系統、Windows系統下的工作,即在這三個環境下都可以進行對yuv格式的視頻壓縮,輸出.264的壓縮視頻文件。將x264對應環境的可執行文件移植到相應的環境中,根據相應的參數運行即可。具體實現步驟如下。(另外,x264不止支持yuv的視頻輸入和.264的輸出,同時還可以支持RAW/y4m/avi/avs的輸入和mkv/mp4的輸出,具體看其參數解釋)

ps:中間經過一個寒假也沒什麼其它進展,目前正忙着整個系統的統一和各個部分代碼的聯調,x264中詳細的算法部分也沒時間詳細研究。

1.在開發板上實現X264

準備:編譯環境:Linux系統

工具:arm-linux-gcc 3.4.1

程序:x264-snapshot 20070920-2245版

實現步驟:

(1)安裝編譯環境Linux系統,我是在Windows上安裝的虛擬機,然後在虛擬機之上安裝的Linux系統。(在虛擬機下的Linux系統中注意,使用Linux與Windows的共享文件夾時,若要對解壓文件進行解壓,要將解壓的文件拷貝到虛擬機linux系統下,而不要在共享文件夾中進行解壓,否則解壓不成功。         

(2)安裝交叉編譯器arm-linux-gcc 3.4.1,其安裝過程:將 arm-linux-gcc 3.4.1.tar.bz2拷貝到Linux系統下,如我拷到了/WeiLi目錄下。—>解壓,tar –jxvf arm-linux-gcc 3.4.1.tar.bz2。—>將解壓文件中的arm文件夾拷貝到/usr/local下,cp –rv arm /usr/local。—>修改環境變量,即將arm-linux-gcc編譯器指定爲3.4.1,gedit /root/.bashrc,在/root/.bashrc這個文件的最後一行添加上命令: export PATH =$PATH:/usr/local/arm/3.4.1/bin。arm-linux-gcc 3.4.1便安裝完畢,就可以使用此交叉編譯器了。

注意:對於我們的開發板,配套使用的編譯器是armv4l-unknown-linux-gcc,經我通過簡單的hello.c程序測試,用arm-linux-gcc編譯出的可執行程序在實驗臺上也能正確運行,所以arm-linux-gcc和armv4l-unknown-linux-gcc在一定程度上可以通用,可能只是版本問題。

(3)修改X264程序,首先對程序進行一些地方的修改,否則會出現關於cpu_set_t的錯誤,關於cpu_set_t的以下那段代碼是關於計算CPU內核數的代碼,所以將np=1(我們所使用的計算機都是單核)直接返回,而沒有用它的計算, #elif defined(SYS_LINUX) unsigned int bit; int np; cpu_set_t p_aff; memset( &p_aff, 0, sizeof(p_aff) );sched_getaffinity( 0, sizeof(p_aff), &p_aff );for( np = 0;bit = 0; bit < sizeof(p_aff); bit++ );np += (((uint8_t *)&p_aff)[bit / 8] >> (bit % 8)) & 1;return np;改成了:#elif defined(SYS_LINUX) int np;np=1; return np;


(4)編譯程序,將x264-snapshot 20070920-2245拷貝到Linux系統下,(在虛擬機的共享文件夾下也可以)。./configure --host=arm-linux。—>修改config.mak文件,將其中的CC=gcc,AS=yasm修改成CC=arm-linux-gcc,AS=arm-linux-as。—>make。之後便生成了可執行文件X264。

注意:此處的X264程序一定要是未被其它編譯器編譯過的程序,即如果此X264是被gcc或者其它編譯器編譯過後的程序,再使用arm-linux-gcc 3.4.1編譯,會出現collect2錯誤。

(5)將生成的可執行文件x264移植到開發板上,運行x264 --qp 18 --keyint 240 --min-keyint 24 --ref 3 --mixed-refs --no-fast-pskip --bframes 3 --b-pyramid --b-rdo --bime --weightb --trellis 1 --analyse all --8x8dct --threads 3 --thread-input --progress --no-dct-decimate –o out.264 foreman_part_qcif_444.yuv 352x288,其中目錄下要有源文件foreman_part_qcif_444.yuv然後運行之後在目錄下就會生成out.264壓縮文件。

2.在Linux系統下實現X264

       準備:Linux系統、x264-snapshot 20070920-2245版程序

對於Linux系統下實現X264要比在開發板上實現簡單,所需要修改的程序與在開發板上實現X264實現步驟中的第三步一樣,然後在Linux系統下./configure—>make之後便生成Linux系統下的X264可執行文件。因爲CC=gcc默認爲gcc編譯器,即是針對PC機的。而gcc編譯工具在裝Linux系統時可以選上。(也需要在PC機上裝nasm,下個rpm包安裝一下就行)

3.在Windows系統下實現X264

      準備:編譯環境:Windows系統

      工具:Microsoft Visual Studio 2003

                建議使用2003,而不要使用visual stdio 6.0,如果使用6.0要打很多的補丁,並且可能還會出現很多其它問題。

      程序:x264-snapshot 20070920-2245版

實現步驟:

(1)安裝Windows操作系統和Microsoft Visual Studio 2003編譯器。並且將nasm拷入C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin下。
(2)修改程序。在使用_strtok_r的函數前加入

#ifndef strtok_r

#define strtok_r(str,delim,save) strtok(str,delim)

#endif

(3)編譯程序,生成X264.exe文件。在cmd中運行,運行x264 --qp 18 --keyint 240 --min-keyint 24 --ref 3 --mixed-refs --no-fast-pskip --bframes 3 --b-pyramid --b-rdo --bime --weightb --trellis 1 --analyse all --8x8dct --threads 3 --thread-input --progress --no-dct-decimate –o out.264 foreman_part_qcif_444.yuv 352x288,其中目錄下要有源文件foreman_part_qcif_444.yuv然後運行之後在目錄下就會生成out.264壓縮文件。

 

需要此x264程序,中間用到的補丁、安裝程序如nasm,又或一些其它資料的,可留下email索取。

附:H.264算法簡介

20033月,ITU-T/ISO正式公佈了H.264視頻壓縮標準。與H.263MPEG-4相比,在同樣質量下,其數碼率能降低一半左右,即在同樣碼率下,其信噪比明顯提高。這樣一來,H.264標準在國際上受到了廣泛地重視和歡迎,被人們稱爲新一代視頻編碼標準。

H.264提供比H.263MPEG-4更高的壓縮性能,使圖像的數據量減少50%,有利於用有限的空間存儲更多的圖像數據;更好地支持網絡傳輸,引入面向對象數據包的編碼有利於將數據打包在網絡中傳輸,支持流媒體服務應用;具有強的抗誤碼特性,以適應在噪聲干擾大、丟包率高的無線信道中傳輸;對不同應用的時延要求具有靈活的適應性;編碼和解碼的複雜度具有可擴展性,支持編碼和解碼複雜度的不等分配和擴展。H.264的這種優異的壓縮性能和良好的網絡親和性,很好地迎合了我們所需要的實時視頻通信。所以H.264廣泛的應用於視頻監控、會議電視、可視電話、遠程醫療、遠程教學、視頻點播、數字電視廣播、數字視頻存儲等等各領域。

H. 264 之所以具有如此高的壓縮性能和良好的網絡親和性,主要是因爲採用了下面的改進技術:1)自適應8 × 8 和4 × 4 整數變換。2)多種模式的空間域幀內預測。3)高效的幀間預測。包括多模式運動估計、高精度的運動估計、多參考幀預測、加權預測。4)高效的熵編碼。5)自適應去方塊濾波。6)其他一些改進。如採用SP和SI幀自適應碼率調整;按功能進行分層;採用塊間濾波器提高性能;通過FMO技術提高了錯誤恢復能力

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章