说下自己的环境
win10 x64
VMware® Workstation 10.0.1 build-1379776
CentOS release 6.5
android-ndk-r10b
ffmpeg3.2.2
Step1
android-ndk-r10b的安装,超级简单,去官网按照自己的配置下载一个,然后放到你习惯的目录下(我直接放/home/android-build/目录下了)。最后export配置下就好了
export NDK_HOME=/home/android-build/android-ndk-r10b/
export PATH=$NDK_HOME:$PATH
Step2
到ffmpeg的官网下载最新的源码包http://www.ffmpeg.org/。并解压到你习惯的位置(我这里解压在/home/work/目录下)然后对他的配置文件稍作修改,原因是为了让编译出来的so库适合Android。
这里主要是修改主目录下的configure文件,你也可以用vi编辑工具修改
Vi /home/work/ffmpeg-3.2.2/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)'
这里无脑改即可,不需要做其它修改。
Step3
这步卡死了枭雄无数,关键在于网上很多说明不是很详细;其实就是一个configure的参数(至于参数的意思自己–help查看哈),ffmpeg的参数比较多根据个人的不同要求可以有不同的配置,网上很多写成*.sh的文件都是可以用的,只不过不清楚里面几个变量的意思含义的话很容易报错卡这里。我也是在这里卡了好一会,感谢github上大神的详解,这里抄袭下:
1.指定临时目录
export TMPDIR=/home/work/ffmpeg-tmp
指定一个临时目录,可以是任何路径,但必须保证存在,ffmpeg编译要用;
2.指定NDK路径
NDK=/home/android-build/android-ndk-r10b
3.指定使用NDK Platform版本
SYSROOT=$NDK/platforms/android-16/arch-arm/
这里指定的ndk platform的路径,一定要选择比你的目标机器使用的版本低的,比如你的手机是android-15版本,那么就选择低于15的
4.指定编译工具链
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
5.指定编译后的安装目录
PREFIX=/home/work/ffmpeg-out/
这个目录是ffmpeg编译后的so的输出目录,会有一个include和lib文件夹生成在这里,这也是我们之后要在android apk中使用的.
上面的1--5分析了半天,其他总的来说就是下面这个编译脚本中的前几行的内容,在ffmpeg主目录下面创建android_build.sh,并赋权限,该脚本中的内容如下:
#!/bin/bash
export TMPDIR=/home/work/ffmpeg-tmp
NDK=/home/android-build/android-ndk-r10b
SYSROOT=$NDK/platforms/android-16/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
CPU=arm
PREFIX=/home/work/ffmpeg-out/
ADDI_CFLAGS="-marm"
#--disable-static 如果不需要静态库,就把这个放在下面的函数中
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--enable-small \
--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
}
build_one
Step4
给sh文件设置可执行权限并执行下sh文件,然后休息几分钟。。。幸运的话 就可以看到结果了。。。顺便提下上面有需要的目录都是需要你事先手动建好顺便把权限设置下。。。
ok,假设你一步步走到这里了。打开你sh文件里指定的放编译结果的目录, $PREFIX 目录下生成 include和lib两个文件夹,将lib文件夹中的 pkgconfig 目录和so的链接文件删除,只保留so文件,然后include 和lib两个目录拷贝出来这就是我们想要的了。
本文主要参考 http://blog.csdn.net/xiaoru5127/article/details/51524795
结合自己的编译环境做了少量修改,如有侵权请及时联系