Android FFmpeg的编译是通过jni调用ffmpeg库的前提。如果你要在android上使用ffmpeg,需要通ndk编译ffmpeg。然后才能在android项目中用jni来使用ffmpeg。
本文参考 http://blog.yikuyiku.com/?p=4533。
本文讲解的是在Ubuntu上通过NDK-r9 编译ffmpeg库;
ndk请去android官网下载。
ffmpeg请去ffmpeg的官网去下载:http://ffmpeg.org/。我用的是2.6.3
1、把下载好的ndk和ffmpeg压缩包解压到指定目录(我都是解压到home下了),解压可以通过命令,或通过软甲打开解压。
2、修改FFmepg编译配置
把ffmpeg目录下的configure文件中的这几行:
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
改为:
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
目的是去掉默认生成的so包,例如libavcode.so.55中最后的那个“55”版本号.
3、编译FFmpeg,创建build_android.sh 执行文件
configure的配置有很多,有兴趣的可以自己研究下。由于本人不懂c,就用网上的流传的配置。
注意前三行要按照自己的路径正确配置。(我就是在这一步出的问题,ndk的路径没有写对,找了好久才找到)
#!/bin/bash
NDK=/home/double/android-ndk-r9d
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
保存后执行:
sudo chmod +x build_android.sh
./build_android.sh
我就是ndk的路径没写对,出现了下面的问题,出现问题了可以代开config.log查看。
给大家做个参考。
4、查看编译结果。
编译成功后,会多出一个android文件夹,里面就是我们编译好东西了。
编译就到这里了,下期会写,在android项目中使用编译好的ffmpeg库。
补充:
编译后生成的android文件夹是带锁的。
用命令:sudo chmod +x android 解锁。