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的环境,还是说说吧
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
如果你想下载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的目录,假如我们全部操作都在
~/mywork/ndk/ffmpeg/目录下,将下载好的ffmpeg源码放在ffmpeg目录下,并改目录名字为jni(名字必须位jni,否则会出现如下的错误)。
另外,下面即将要说到的config.sh脚本和Android.mk文件也要放在这个目录下
在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权限使其能够执行
$sudo chmod a+x config.sh
执行config.sh脚本
$./config.sh
如果出现如下的样子就说明脚本执行成功了
下面的WARNING可以不用管,不会对使用有影响
我们还需要在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动态库