(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源代码需要修改一些源文件才能顺利编译通过,不过这里为了方便给大家贴出来错误信息提供参考,我直接执行编译脚本,编译过程出现错误如下:
分析错误原因是类型冲突,具体我也没深究,直接想了个简单办法:
首先要知道 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:上面的文件修改完成后,再次执行编译脚本,又出现了下面的错误:
由于实验室的项目用不到语音,所以对于错误: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 文件了,:
结束:
之前实验室项目一直用的是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; 就可以了。