1. 程式人生 > >X264的ARMV7-a的交叉編譯及優化執行

X264的ARMV7-a的交叉編譯及優化執行

一:準備工作 1、作業系統是Ubuntu 12.04。 2、需要安裝Google的NDK工具,因為在編譯時使用了NDK提供的編譯器。我的NDK的安裝目錄放在/home/shallon/android-ndk-r8d。另外,需要安裝android的SDK,提供ADB等除錯的工具 3、下載獲取X264的原始碼。 git clone git://git.videolan.org/x264.git 4、使用配置編譯的指令碼 export ARM_ROOT=/home/shallon/android-ndk-r8d export ARM_INC=$ARM_ROOT/platforms/android-14/arch-arm/usr/include/ export ARM_LIB=$ARM_ROOT/platforms/android-14/arch-arm/usr/lib/ export ARM_TOOL=$ARM_ROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86 export ARM_LIBO=$ARM_TOOL/lib/gcc/arm-linux-androideabi/4.4.3 export PATH=$ARM_TOOL/bin:$PATH export ARM_PRE=arm-linux-androideabi ./configure --disable-gpac --enable-pic --enable-strip --extra-cflags=" -I$ARM_INC -fPIC -DANDROID -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -march=armv7-a -mtune=cortex-a9 -mfloat-abi=softfp -mfpu=neon -D__ARM_ARCH_7__ -D__ARM_ARCH_7A__  -Wno-psabi -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID  -Wa,--noexecstack -MMD -MP " --extra-ldflags="-nostdlib -Bdynamic -Wl,--no-undefined -Wl,-z,noexecstack  -Wl,-z,nocopyreloc -Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$ARM_LIB -nostdlib $ARM_LIB/crtbegin_dynamic.o $ARM_LIB/crtend_android.o -lc -lm -ldl -lgcc" --cross-prefix=${ARM_PRE}- --host=arm-linux --enable-static --prefix=/home/shallon/x264/build 配置關鍵點1:指定使用的交叉編譯的編譯器、連結的標頭檔案及類庫所在 配置關鍵點2:-march=armv7-a -mtune=cortex-a9 -mfloat-abi=softfp -mfpu=neon -D__ARM_ARCH_7__ -D__ARM_ARCH_7A__ ,此處,針對armv7-a的CPU打開了NEON的優化執行指令。 配置關鍵點3:去掉--disable-asm選項。該選項的意思就是禁止neon的指令。 配置關鍵點4:新增--enable-static選項,生成靜態連結的庫供
程式開發
使用。 5、配置執行的環境 export ARM_LINUX_ANDROIDEABI_GCC=/home/shallon/android-ndk-r8d/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin export PATH=$ARM_LINUX_ANDROIDEABI_GCC:$PATH 6、編譯 直接執行 :make 在當前目錄生成x264的執行檔案,以及連結的.a檔案 檢視x264檔案的型別看看交叉編譯是否成功。 [email protected]:~/x264$ file x264 x264: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped 7、上傳到nexu 7上執行,nexu 7上需要有root的許可權。
[email protected]
:~/x264$ adb push x264 /sdcard/x264 829 KB/s (509135 bytes in 0.599s) adb shell進入nexu 7裝置,將x264檔案拷貝到/data/app目錄下, cd /data/app /data/app # cp /sdcard/x264 . 8、執行x264命令 [email protected]:/data/app # ./x264 -o test.264 ./352x288.yuv                       yuv [info]: 352x288p 0:0 @ 25/1 fps (cfr) x264 [info]: using cpu capabilities: ARMv6 NEON x264 [info]: profile High, level 1.3 x264 [info]: frame I:2     Avg QP:23.74  size:  4170                            x264 [info]: frame P:79    Avg QP:25.20  size:  1849 x264 [info]: frame B:65    Avg QP:26.13  size:   358 x264 [info]: consecutive B-frames: 35.6% 13.7%  4.1% 46.6% x264 [info]: mb I  I16..4:  8.8% 84.8%  6.3% x264 [info]: mb P  I16..4:  4.4% 15.0%  0.8%  P16..4: 44.5% 11.5%  6.5%  0.0%  0.0%    skip:17.1% x264 [info]: mb B  I16..4:  0.0%  0.0%  0.0%  B16..8: 40.2%  0.8%  0.2%  direct: 2.5%  skip:56.3%  L0:43.6% L1:53.1% BI: 3.3% x264 [info]: 8x8 transform intra:75.3% inter:91.3% x264 [info]: coded y,uvDC,uvAC intra: 49.8% 80.8% 75.4% inter: 15.0% 22.8% 9.1% x264 [info]: i16 v,h,dc,p: 33% 17%  4% 47% x264 [info]: i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 29%  9% 16%  4%  8% 17%  6%  6%  5% x264 [info]: i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 37%  9% 10%  4% 10% 20%  4%  4%  2% x264 [info]: i8c dc,h,v,p: 47% 22% 30%  1% x264 [info]: Weighted P-Frames: Y:21.5% UV:6.3% x264 [info]: ref P L0: 65.7% 15.7% 13.6%  4.7%  0.4% x264 [info]: ref B L0: 88.1% 10.4%  1.5% x264 [info]: ref B L1: 94.2%  5.8% x264 [info]: kb/s:243.40 encoded 146 frames, 10.81 fps, 243.40 kb/s

X264 FOR ANDROID

x264是一種免費的、具有更優秀演算法的H.264/MPEG-4 AVC視訊壓縮編碼格式。它同xvid一樣都是開源專案,但x264是採用H.264標準的,而xvid是採用MPEG-4早期標準的。由於H.264是2003年正式釋出的最新的視訊編碼標準,因此,在通常情況下,x264壓縮出的視訊檔案在相同質量下要比xvid壓縮出的檔案要小,或者也可以說,在相同體積下比xvid壓縮出的檔案質量要好。它符合GPL許可證。

x264在視訊應用中經常使用,很多github上的專案都使用該編碼,我這裡只是講一下如何在linux上編譯它,併為Android NDK呼叫服務,你可以按照以下步驟來進行:
1. 安裝Android NDK(我安裝的是android-ndk-r10c-linux-x86_64.bin);

2. 下載x264:

git clone git://git.videolan.org/x264.git

export NDK_SYSROOT=/opt/ndk/platforms/android-9/arch-arm

export PATH=$PATH:/opt/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/

./configure --cross-prefix=arm-linux-androideabi- \
--sysroot="$NDK_SYSROOT" --host=arm-linux  \
--enable-pic --enable-static --disable-cli

./make STRIP=

以上片段中有很多引數,特別配置時的引數,我們來聊一下:
–sysroot

--sysroot="Android/ndk/platforms/$ANDROID_API_VERSION/arch-arm"
#sysroot option provides the logical root directory for 
 headers and libraries. This is useful when you don’t 
 want the headers/libraries in the standard paths 
 affect your build. As we want to use Android cross
 compiler so we need to set the path of Android cross
 compiler as sysroot.
當我們在進行跨平臺編譯時,為了不使我們的編譯受當前平臺的影響,
我們指定跨平臺編譯的標頭檔案和庫。

–cross-prefix

--cross-prefix=arm-linux-androideabi-
#cross prefix used for locating compilation
 tools in PATH env variable e.g in place of
 gcc it will use arm-linux-androideabi-gcc
指定跨平臺的編譯器而不是linux預設的gcc或者你指定的其它編譯器,因為我們是編譯android平臺

–host

--host=arm-linux
#host system for which we are compiling. 
Here we are compiling for 2 different Android 
architectures namely armv7 and armv7-a neon

–enable-pic

--enable-pic
#position-independent code commonly used for shared libraries

–enable-static

--enable-static
#build static library

–disable-cli

--disable-cli
#disable cli

編譯引數

STRIP
# delete local/anonymous symbols, 
so they don't show up in oprofile

3. 將編譯好的libx264.a,x264.h和x264_config.h三個檔案防盜jni對應的位置,然後在Android.mk裡進行配置;

還好我用的linux,看看那些windows的,比較麻煩,不過習慣就好了。


相關推薦

X264的ARMV7-a交叉編譯優化執行

一:準備工作 1、作業系統是Ubuntu 12.04。 2、需要安裝Google的NDK工具,因為在編譯時使用了NDK提供的編譯器。我的NDK的安裝目錄放在/home/shallon/android-ndk-r8d。另外,需要安裝android的SDK,提供ADB等除

樹莓派3b+ 交叉編譯 升級 kernel

安裝 gcc pkg 等工具sudo apt-get install build-essential git 官方介紹 https://www.raspberrypi.org/documentation/linux/kernel/building.mdhttps://www.raspberrypi.org

qtcreator下cmake工程交叉編譯遠端部署環境搭建

1 安裝目標開發板對應的交叉編譯器。 首先,在開發板上使用下面命令檢視cpu硬體架構: uname -a我的顯示有aarch64字樣,即我的開發板為armv8a-aarch64架構。接下來在開發電腦上使用下面命令來安裝c和c++編譯器: sudo apt-get ins

tcpdump交叉編譯使用

第一步.下載 官方網站:http://www.tcpdump.org/ 需要下載libpcap包和tcpdump包 我下載的版本是:libpcap-1.4.0.tar.gz和tcpdump-4.4.0.tar.gz 第二步.編譯libpcap包 2.1 解壓tar -zxv

amixer,aplay,arecord交叉編譯使用

一.amixer用於控制設定  amixer的幫助提示資訊 Usage: amixer <options> [command] Available options: -h,--help this help -c,--card N s

手工編譯apache,優化壓縮,緩存工作模式。

4.2 重新 oca 加權 監聽 mpm a13 ecc redhat6 實驗環境:redhat6.5 一臺win10 抓包工具fiddler 安裝包:apr-1.4.6.tar

手工編譯apache優化之防盜鏈隱藏版本信息

版本 制圖 簡易 mage b2b tex water watermark 版本信息 銜接我的上篇博客http://blog.51cto.com/13760226/2158459 一、微軟上編寫簡易的盜鏈網站 1、編寫盜鏈 2、添加本地網頁 3、查看盜鏈的網頁 二、寫

如何優化JAVA代碼提高執行效率(轉)

car jdk nts 外部 ast 兩種 泛型 copy app 可供程序利用的資源(內存、CPU時間、網絡帶寬等)是有限的,優化的目的就是讓程序用盡可能少的資源完成預定的任務。優化通常包含兩方面的內容:減小代碼的體積,提高代碼的運行效率。本文討論的主要是如何提高代碼的效

Mips平臺kaldi原始碼的交叉編譯一OpenBlasClapack的交叉編譯

前言: OpenBlas是一款開源的矩陣運算庫,具體介紹參考http://www.openblas.net/ 。在linux PC上,即訓練時,採用的數學矩陣庫為atlas,此數學庫未開源,在linux中只提供lib庫,所以在嵌入式平臺中,我們需要編譯openblas生成對應的數學

日誌工具zlog交叉編譯至imx下位機執行

2018-11-22  白微 zlog的官網http://hardysimpson.github.io/zlog/ zlgo github原始碼下載網https://github.com/HardySimpson/zlog/releases 有網友提供瞭如下版本,方便其他平臺上安裝編譯,非常感

樹莓派交叉編譯環境wiringPi庫

首先,我的硬體是樹莓派3b+,需求是:     1.在主機上使用樹莓派的編譯器,生成樹莓派可執行檔案     2.在主機上使用樹莓派的動態連結庫,如pthread、wiringPi等   樹莓派的交叉編譯環境還算好弄的,解壓 ->

openWRT Ubuntu環境搭建交叉編譯工具製作與使用

Openwrt本身不支援直接編譯C語言的,不支援GCC,因此,我們在Ubuntu下寫好的程式碼,通過gcc編譯後的可執行檔案是不能直接在openWRT上執行的。 因此,我們需要製作基於openWRT的交叉編譯工具 toolchain。 1

GO專案編譯執行

近期下載了一個名為藍眼雲盤的專案作為學習研究用途。這是一個伺服器端用go語言開發的開源專案。 我從未用過GO語言,所以會遇到一些低階的問題要加以解決。總計解決了以下4個問題: 1、配置GOPATH 2、GOPATH分為全域性GOPATH和專案GOPATH 3、下載依賴包 4、設定專案

通過位元組碼分析 JDK8 中 Lambda 表示式編譯執行機制

關於Lambda位元組碼相關的文章,很早之前就想寫了,[蜂潮運動]APP 產品的後端技術,能快速迭代,除了得益於整體微服架構之外,語言層面上,也是通過Java8的lambda表示式的運用以及rxJava響應式程式設計框架,使程式碼更加簡潔易維護,呼叫方式更加便捷。

GDB arm-linux交叉編譯移植和使用方法(特別是對於正在執行的程式或者段錯誤的程式進行分析)

測試程式碼中的test1是用來定位堆疊段錯誤,Delay函式是用來定位程式阻塞,都可以用gdb定位出來,如下:  (1)測試程式執行時首先會有個段錯誤:./gdbtest & [[email protected] user0]$ [65334.020000] pgd = c3e14000 [

java開啟子執行緒的方法優化

1.new Thread的弊端 執行一個非同步任務你還只是如下new Thread嗎? 1 2 3 4 5 6 7 new Thread(new Runnable() {       &

Lunix下codeblocks靜態庫(.a檔案)動態庫(.so檔案)編譯

Lunix 下靜態庫.a檔案相當於windows下.lib檔案,.so檔案相當於windows下.dll檔案,下面來說一下編譯他們的一種方法(不唯一,可以通過terminal編譯)。 1.編譯.a檔案

linux執行應用程式not found問題(交叉編譯生成的可執行檔案)

[email protected]:~/Desktop/em35x-ezsp$readelf -a build/ZigBee/ZigBee |grep NEEDED  0x00000001 (NEEDED)                     Shared library: [libreadli

交叉編譯AWS IOT C++ SDK環境測試

開始前 先強烈建議 登入控制檯走一遍亞馬遜的引導流程,並用nodejs版 在你ubuntu上跑一邊,把策略檔案生成了。並瞭解如何建立事物(裝置) 當前版本: aws-iot-device-sdk-cpp: Release version 1.3.0 O

Linux下的ds18b20驅動(執行環境 Fedora9.0 交叉編譯 arm-linux-gcc-4.3.2 核心版本2.6.32)

今天在各位前輩已有成就的基礎上花了兩天時間終於把這個驅動給搞定了,從開始編譯成模組看效果,進行除錯,再到編譯進核心,最後又編譯了一個介面出來,雖說大多數的程式程式碼是用各位前輩的成果,但坐下來自己收穫也不小,現在寫下來,以供以後參考,也和各位愛好者交流一下,呵呵! 一.編譯成