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文件的类型看看交叉编译是否成功。
shallon@shallon-Joybook-R48:~/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的权限。
shallon@shallon-Joybook-R48:~/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命令
root@android:/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的,比较麻烦,不过习惯就好了。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值