NDK编译 x264 及调用出现的异常情况解决

这里简单介绍 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

问题就解决了






你可能感兴趣的:(linux)