参考文章:http://www.cnblogs.com/scottwong/archive/2010/12/17/1909455.html#2363900
http://www.cnblogs.com/shaobin0604/archive/2011/08/05/2128619.html
http://blog.csdn.net/vrix/article/details/6930081
最近要做到与视频相关的项目,于是要了解一下ffmpeg,这就要先编译ffmpeg,但本人却是一个对ffmpeg不了解的菜鸟,于是去网上找了一些资料(如本文开头部分的链接),然后按照其中的方式来,编译了一天怎么也编译不出来。郁闷中,一点点的尝试、修改,终于编译成功了。总结一下遇到的问题:
1、sed: can't read config.h: No such file or directory,解决办法:就在执行可执行文件config.sh之前执行cat > config.h创建一个config.h。
2、error:static declaration of "trunc' follows non-static declaration错误,解决办法:将libavutil/libm.h打开,把中间的static方法去掉。(粗暴的解决方法,会产生什么样的后果目前还暂未得知,如果有那位大哥知道原因也不妨告知一二)
3、编译到最后的时候报错Error 1, 解决办法:将config.h中的一个地方的关键词restrict去掉一个。
第一步:下载软件
1 下载相应的Android NDK r6文件
2 下载FFmpeg0.8.1的版本(将其解压之后放在/data/ffmpeg/下面重命名为jni)
本文的相关路径如下:
第二步:配置编译环境
NDK r6 路径:/opt/android/android-ndk-r6/
ffmpeg 路径:/data/ffmpeg/jni
第二步:创建可执行脚本
在/data/ffmpeg/jni/下创建一个可执行脚本config.sh
./configure \ --disable-static \ --enable-shared \ --enable-gpl \ --enable-version3 \ --enable-nonfree \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-avdevice \ --disable-avfilter \ --disable-postproc \ --enable-small \ --cross-prefix=/opt/android/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi- \ --enable-cross-compile \ --target-os=linux \ --extra-cflags='-I/opt/android/android-ndk-r6/platforms/android-8/arch-arm/usr/include' \ --extra-ldflags='-L/opt/android/android-ndk-r6/platforms/android-8/arch-arm/usr/lib -nostdlib' \ --arch=arm \ --disable-debug \ --disable-stripping \ sed -i 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h sed -i 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h sed -i 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h sed -i 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h sed -i 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h sed -i 's/HAVE_SYMVER 1/HAVE_SYMVER 0/g' config.h
以下几个属性需要根据ndk安装的位置做相应的修改
- cross-prefix
- extra-cflags
- extra-ldflags
第四步:编写Android.mk文件,路径:/data/ffmpeg/jni/。
内容可以去https://gist.github.com/1126971这里下载。
第五步:生成ffmpeg配置文件
打开终端,定位到 /data/ffmpeg/jni 目录,执行 chmod +x config.sh修改config.sh的权限。
接着执行:./config.sh,注意:如果这个地方报错sed: can't read config.h: No such file or directory,就在执行可执行文件config.sh之前执行cat > config.h创建一个config.h。
这里有一个警告,暂时不知道如何解决,如果那位大哥知道的话还希望指点一二。
接着执行:定位到 /data/ffmpeg/jni 目录,执行/opt/android/android-ndk-r6/ndk-build,这个时候会报错,用gedit工具将/data/ffmpeg/jni/libavutil/libm.h打开,把中间的static方法去掉
然后重新执行ndk-build命令。
这个时候编译还是失败了,如下截图
原来忘了将config.h中的一个地方的关键词给去掉
最后终于编译成功了,截图为证。