代码改变世界

[原]在ubuntu 10.04.4下用NDK6编译ffmpeg

2012-04-26 15:59  雪夜&流星  阅读(2394)  评论(1编辑  收藏  举报

参考文章: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中的一个地方的关键词给去掉

最后终于编译成功了,截图为证。