Ubuntu 下用NDK编译移植 FFmpeg 2.0 (配置最新版x264)(4)

(4)修改完成后,执行编译脚本 ./make-ffmpeg-Android.sh 脚本,脚本内容如下:

#!/bin/bash

DEST=`pwd`/build/ffmpeg && rm -rf $DEST
SOURCE=`pwd`/ffmpeg

TOOLCHAIN=/tmp/vplayer
SYSROOT=$TOOLCHAIN/sysroot/

export PATH=$TOOLCHAIN/bin:$PATH
export CC="arm-linux-androideabi-gcc"
export LD=arm-linux-androideabi-ld
export AR=arm-linux-androideabi-ar

CFLAGS="-Os -fPIC -marm"

VERSION=armv7
cd $SOURCE

PREFIX="$DEST/$VERSION" && mkdir -p $PREFIX


EXTRA_LDFLAGS="-L../android-x264/lib"

make clean
make -j4 || exit 1
make install || exit 1

$CC -llog -lm -lz -shared --sysroot=$SYSROOT -Wl,--no-undefined -Wl,-z,noexecstack $EXTRA_LDFLAGS libavutil/*.o libavutil/arm/*.o libavcodec/*.o libavcodec/arm/*.o libavformat/*.o libswresample/*.o libswscale/*.o -o $PREFIX/libffmpeg.so  -lx264 -L/home/yinjingyu/workspace/lab-project/ffmpegcpl/FFmpeg-Android/lib/-lx264

cp $PREFIX/libffmpeg.so $PREFIX/libffmpeg-debug.so

arm-linux-androideabi-strip --strip-unneeded $PREFIX/libffmpeg.so

echo "build successfully!"

注意,下载下来的ffmpeg源代码需要修改一些源文件才能顺利编译通过,不过这里为了方便给大家贴出来错误信息提供参考,我直接执行编译脚本,编译过程出现错误如下:

Ubuntu 下用NDK编译移植 FFmpeg 2.0 (配置最新版x264)

分析错误原因是类型冲突,具体我也没深究,直接想了个简单办法:

首先要知道 strtod 是C库函数,用来实现将字符串转化成double类型的数据。ffmpeg可能自己又重新实现了一套自己的函数叫做:avpriv_strtod,两种实现导致了类型冲突。

我的解决方法就是注释掉ffmpeg自己的实现,直接使用c库的函数。具体步骤如下:

步骤1:进入我们交叉编译链的目录,如果你的配置脚本和我一样,那就应该是 /tmp/vplayer(之前我们专门拷贝了一份编译链到该目录下)。在该目录下有一个sysroot目录(用来保存链接时用到的头文件和库),进入sysroot --> include 下,用vi 打开 stdlib.h 文件,添加如下内容:

+++//add by chance_yin 2013.12.27
+++#undef avpriv_strtod
+++#undef strtod
+++#define strtod strtod

步骤2:注释掉 ffmpeg/compat/strtod.c中的所有代码

步骤3:在如下文件: libavutil/eval.c、libavformat/rtmpproto.c 中的开头位置添加如下代码,

#include <stdlib.h>

#undef avpriv_strtod

#undef strtod

#define strtod strtod

步骤4:上面的文件修改完成后,再次执行编译脚本,又出现了下面的错误:

Ubuntu 下用NDK编译移植 FFmpeg 2.0 (配置最新版x264)


由于实验室的项目用不到语音,所以对于错误:swri_audio_convert_init_arm,我的处理办法是直接注释掉,

剩下的关于 log2_tab.o multiple definition 的错误,就好解决了,

用vi 打开: libavcodec/Makefile 、libavformat/Makefile 、libswresample/Makefile 文件,将其中的

OBJS-$(CONFIG_SHARED) += log2_tab.o 注释掉即可。

好了,源代码的编译算是告以段落了,贴出来编译成功的图,然后你就可以在FFmpeg-android/build/ffmpeg/armv7目录下找到编译完成的 libffmpeg.so 文件了,:

Ubuntu 下用NDK编译移植 FFmpeg 2.0 (配置最新版x264)

Ubuntu 下用NDK编译移植 FFmpeg 2.0 (配置最新版x264)

结束:

之前实验室项目一直用的是ffmpeg 0.x的版本,昨天把2.0版本的libffmpeg.so整合到项目中发现原来的代码在 avcodec_open2 报错,在ffmpeg相应源文件中打了log才发现是2.0之后,ffmpeg弃用了很多宏,比如:

项目老版本的程序执行到 avcodec_open2 出错, 在源代码此方法的实现中打log,

发现停在了“specific pixfmt not supported 。。。”,google一下,发现在ffmpeg2.0版本中,ffmpeg不再支持pCodecCtxEnc->pix_fmt = PIX_FMT_YUV420P;只要把该值设置成pCodecCtxEnc->pix_fmt = AV_PIX_FMT_YUV420P; 就可以了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/18795.html