`
RandyWei
  • 浏览: 65182 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 音视频编解码系列(1)--ubuntu下ndk编译ffmpeg0.8.1

 
阅读更多

  ffmpeg最新版本有些问题,比如jni/liblibavcodec/ac3enc_combined.c在最新的版本中已经没有了,但是又多了一个ac3enc_template.c的文件。虽然更新版本对于开发人员可以使用到更多的功能,但是如果这样乱改的话真的好无语,非常讨厌这种更新版本的不一致性,唉,只是抱怨一下

我使用的还是稍微老一点的版本ffmpeg 0.8.1的,至少老的版本能搜到更多的资料,也比较稳定。

ffmpeg版本:ffmpeg 0.8.1(最新版本是0.10,但是有很多问题)

NDK版本:ndk r6(ndk r7编译的话会出现各种错误)

机器:32位

系统:ubuntu

注意:ndk r6+ffmpeg0.8.1+Android.mk+config.sh是经过测试过的,可以生成。如果你用的其他版本的会出现各种问题

前提:需要你配置好NDK的环境,还是说说吧

一、下载并配置NDK环境变量(ubuntu下,windows下请使用cygwin)

1、到http://developer.android.com/sdk/ndk/index.html下载NDK

这里,ndk r6版本的下载地址是:http://dl.google.com/android/ndk/android-ndk-r6-linux-x86.tar.bz2

2、解压包到/home/loulijun/android/目录下

3、$vim ~/.bashrc    在里面添加如下信息

export NDK=/home/loulijun/android/android-ndk-r6
107 export PATH=${PATH}:$NDK

4、$source ~/.bashrc 使其生效

注意:最新r7版本出现了一个关于awk问题,这个awk是64位的,所以如果你是32位机会遇到,具体解决办法见我的上篇博客:

http://www.cnblogs.com/loulijun/archive/2012/02/26/2368787.html

 

二、下载ffmpeg源码包

如果你想下载ffmpeg0.8.1版本(老版本),请点击这里:http://www.ffmpeg.org/releases/ffmpeg-0.8.1.tar.gz

如果你想下载最新版本,可以到http://ffmpeg.org/download.html下载

使用$git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg

但是下载后的虽然是最新且纯净的代码,可能Android.mk文件与之不完全匹配,如果非要用最新版本的话最好修改一下Android.mk吧(工作量有点大)


三、配置ffmpeg环境

可以系统目录下创建一个用于存放ffmpeg的目录,假如我们全部操作都在

~/mywork/ndk/ffmpeg/目录下,将下载好的ffmpeg源码放在ffmpeg目录下,并改目录名字为jni(名字必须位jni,否则会出现如下的错误)。

另外,下面即将要说到的config.sh脚本和Android.mk文件也要放在这个目录下

四、添加config.sh脚本到jni目录中

在jin目录下创建名为config.sh脚本文件,在里面添加如下的内容

这一步很重要,下面的这个脚本主要是用于生成config.h文件和config.mak文件,否则无法build

下面内容就是config.sh文件了。可点击这里下载:

注意:需要修改cross-prefix、extra-cflags、extra-ldflags的路径

./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=/home/loulijun/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/home/loulijun/android/android-ndk-r6/platforms/android-9/arch-arm/usr/include' \
    --extra-ldflags='-L/home/loulijun/android/android-ndk-r6/platforms/android-9/arch-arm/usr/lib -nostdlib' \
    --arch=arm \
    --disable-symver \
    --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_TRUNC 0/HAVE_TRUNC 1/g' config.h
sed -i 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h

 

五、执行config.sh脚本

首先需要给config.sh权限使其能够执行

$sudo chmod a+x config.sh

执行config.sh脚本

$./config.sh

如果出现如下的样子就说明脚本执行成功了

下面的WARNING可以不用管,不会对使用有影响

六、添加Android.mk文件到jni目录中

我们还需要在jni目录下添加一个Android.mk文件,使其交叉编译,内容如下。

也可以到https://gist.github.com/1126971下载,一样的

 

注意:

1、需要给Android.mk和config.h文件权限

$sudo chmod a+x Android.mk

$sudo chmod a+x config.h

2、网上有些Android.mk文件已经不能适应最新版本了,因为ffmpeg最新版本有些问题,比如jni/liblibavcodec/ac3enc_combined.c在最新的版本中已经没有了,但是又多了一个ac3enc_template.c的文件。虽然更新版本对于开发人员可以使用到更多的功能,但是如果这样乱改的话真的好无语,非常讨厌这种更新版本的不一致性,唉,只是抱怨一下

Android.mk文件内容

现在开始编译ffmpeg,编译这步是最最麻烦的,因为会遇到各种各样不同的问题,不同版本的源码包也是遇到不同的问题,总之听纠结的。

编译很简单,进入jni目录下,执行ndk-build命令即可(如果ndk-build命令未找到,说明你NDK环境没有配好),如果编译失败可以用ndk-build clean清理。

$cd jni

$ndk-build    然后开始编译

编译成功后的结果如下,生成了libffmpeg.so动态库

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics