这里简单介绍 x264 源码下载和编译的过程,具体也可以参考网上其他资料
x264源码下载链接 http://www.videolan.org/developers/x264.html 可以通过这个链下载
解压后进行,进入到 x264 文件路径下
编辑 NDK交叉编译 shell 脚本:
build_x264.sh (名称可自定义)
#!/bin/sh
export NDK=/usr/local/android-ndk-r10e
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
export PLATFORM=$NDK/platforms/android-14/arch-arm/
export PREFIX=$(pwd)/libs
./configure --prefix=$PREFIX \
--enable-static \
--enable-shared \
--enable-pic \
--disable-asm \
--disable-lavf \
--disable-cli \
--host=arm-linux \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
--sysroot=$PLATFORM
make uninstall
make clean
make -j4
make install
在windows 桌面编辑的 sh 脚本还需要考虑编码问题。
vi build_x264.sh
在脚本底下 看到 dos 字样说明是在windows 编辑需要改成 unix 格式
esc : set ff # 查看shell 脚本格式
esc : set ff = unix #修改sh格式为成 unix
# 如果shell 脚本权限是不可执行的 ,还需要修改权限
chmod 777 build_x264.sh
#执行 shell 脚本
./build_x264.sh
就完成编译和安装
在当前路径的 libs 文件下自动生成 /lib 和 /include 文件夹别分存放 libx264.a libx264.so 和 x264.h , x264_config.h
如果想修改生成路径 可以修改sh 中的 export PREFIX=$(pwd)/libs
$(pwd) 定位当前路径
调用x264 时,根据需要添加静态库或动态库,选择libx264.a 或 libx264.so 文件
我使用 libx264.a 进行编程
我在调用的时候出现以下两个异常情况,具体是什么原因也说不说清楚,看到这篇博客后,也欢迎大家留言告诉我
问题一 :
libx264.a(encoder-8.o):encoder.c:function validate_parameters: error: undefined reference to 'log2f'
libx264.a(encoder-8.o):encoder.c:function x264_8_encoder_reconfig: error: undefined reference to 'log2f'
libx264.a(ratecontrol-10.o):ratecontrol.c:function x264_10_ratecontrol_new: error: undefined reference to 'log2'
这个异常,其实在编译程序时,有认真留意编译过程的在控制台的日志,也是会出现warnning 警告信息:
如下:
encoder/encoder.c: In function 'validate_parameters':
encoder/encoder.c:870:9: warning: implicit declaration of function 'log2f' [-Wimplicit-function-declaration]
float qp_i = qp_p - 6*log2f( h->param.rc.f_ip_factor );
^
encoder/encoder.c:870:31: warning: incompatible implicit declaration of built-in function 'log2f' [enabled by default]
float qp_i = qp_p - 6*log2f( h->param.rc.f_ip_factor );
analyse.c:188:9: warning: implicit declaration of function 'log2f' [-Wimplicit-function-declaration]
logs[i] = log2f( i+1 ) * 2.0f + 1.718f;
^
encoder/analyse.c:188:19: warning: incompatible implicit declaration of built-in function 'log2f' [enabled by default]
logs[i] = log2f( i+1 ) * 2.0f + 1.718f;
^
encoder/ratecontrol.c: In function 'qscale2qp':
encoder/ratecontrol.c:208:5: warning: implicit declaration of function 'log2f' [-Wimplicit-function-declaration]
return (12.0f + QP_BD_OFFSET) + 6.0f * log2f( qscale/0.85f );
^
encoder/ratecontrol.c:208:44: warning: incompatible implicit declaration of built-in function 'log2f' [enabled by default]
return (12.0f + QP_BD_OFFSET) + 6.0f * log2f( qscale/0.85f );
/ratecontrol.c:789:9: warning: implicit declaration of function 'log2' [-Wimplicit-function-declaration]
double bits_required = log2( num )
^
encoder/ratecontrol.c:789:32: warning: incompatible implicit declaration of built-in function 'log2' [enabled by default]
double bits_required = log2( num )
^
encoder/ratecontrol.c:819:27: warning: incompatible implicit declaration of built-in function 'log2f' [enabled by default]
rc->ip_offset = 6.0 * log2f( h->param.rc.f_ip_factor );
^
encoder/ratecontrol.c: In function 'x264_10_ratecontrol_start':
encoder/ratecontrol.c:1508:24: warning: incompatible implicit declaration of built-in function 'log2f' [enabled by default]
q -= 6*log2f( zone->f_bitrate_factor );
^
encoder/set.c: In function 'x264_10_sps_init':
encoder/set.c:248:9: warning: implicit declaration of function 'log2f' [-Wimplicit-function-declaration]
sps->vui.i_log2_max_mv_length_vertical = (int)log2f( X264_MAX( 1, param->analyse.i_mv_range*4-1 ) ) + 1;
^
encoder/set.c:248:55: warning: incompatible implicit declaration of built-in function 'log2f' [enabled by default]
sps->vui.i_log2_max_mv_length_vertical = (int)log2f( X264_MAX( 1, param->analyse.i_mv_range*4-1 ) ) + 1;
^
encoder/encoder.c:870:9: warning: implicit declaration of function 'log2f' [-Wimplicit-function-declaration]
float qp_i = qp_p - 6*log2f( h->param.rc.f_ip_factor );
^
encoder/encoder.c:870:31: warning: incompatible implicit declaration of built-in function 'log2f' [enabled by default]
float qp_i = qp_p - 6*log2f( h->param.rc.f_ip_factor );
解决办法是将 源码中的 osdep.h 文件中的
#if !HAVE_LOG2F 直接替换成 #if 1
重新进行编译,问题就解决了,至于为什么也欢迎大家告诉我
第二个问题:
x264.h:811:5: error: 'int64_t' does not name a type
x264.h:814:5: error: 'int64_t' does not name a type
x264.h:951:50: error: 'int64_t' has not been declared
有了第一个问题解决经验,第二个问题也是直接修改 x264.h:
将 int64_t 改为 uint64_t
问题就解决了