在Android项目中使用FFmpeg,可能要根据需求,砍掉FFmpeg的一些没用到的功能(减小包体积),然后编译动态库(.so),然后将so导入到Android项目中。
接下来就开始实践FFmpeg的编译~
一、下载ffmpeg源码
推荐下载主流版本,先不去编最新版本,遇到问题比较好解决,
本文使用版本:ffmpeg-3.1.3
写这篇文章的时候,最新版:ffmpeg-4.1.3
官网下载并解压:
http://www.ffmpeg.org/download.html
二、下载NDK,配置环境
(这一步并不是必须的,因为可以在编译脚本里指定NDK全路径,配置一下吧,很简单)
下载地址:
https://developer.android.google.cn/ndk/downloads/older_releases.html
这里注意下载的版本,使用新版本可能有很多报错,这里强烈建议下载这个版本
android-ndk-r10e
下载完解压
NDK环境配置
cd ~
open -e .bash_profile
打开配置文件,加入如下配置,路径填自己的ndk路径,然后保存退出
export NDK_ROOT=/Users/lanshifu/Documents/tool/android-ndk-r10e
export PATH=${PATH}:$NDK_ROOT
刷新一下配置:
source .bash_profile
验证NDK环境是否配置成功
NDK下有一个sample目录(最新版NDK可能不是这个目录),
android-ndk-r10e/samples/
控制台切换到这个目录,然后执行
cd hello-jni
ndk-build
出现如下提示,so生成,就是配置成功了
NDK配置到此结束
三、编译FFmpeg动态库
第一步下载并解压了FFmpeg,目录差不多如下
看到有个configure可执行文件
执行
./configure --help
看到很多配置说明,可以导出文本查看
./configure --help -> help.txt
open -e help.txt
很多参数可以配置,disable or enable,可以根据需求砍掉一些功能。
我们可以这样写
./configure --enable-shared --enable-small ...
但是参数多的时候这样写明显不方便,所以创建一个可执行文件
build_ffmpeg.sh
#!/bin/sh
#FFmpeg 3.1.3 + ndk-r10e 编译脚本
#NDK,这里指定全路径(也可以用环境变量)
NDK=/Users/lanshifu/Documents/tool/android-ndk-r10e
SYSROOT=$NDK/platforms/android-21/arch-arm
#工具链
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
#cpu类型
CPU=arm
#so生成到哪个目录:/android/arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
function build
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-yasm \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--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
}
build
脚本写好了,其中变量要根据自己的情况修改,如果NDK版本跟FFmpeg版本都跟我一样,那可以直接复制这个脚本,只更改NDK全路径即可。
还不能直接这样编译,因为默认编译出来是 linux 的命名方式,
我们需要加一个步骤,在 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)'
然后就可以执行脚本编译了:
./build_ffmpeg.sh
如果不出意外,编译成功就可以看到产物了
一共8个so,箭头指向的是真正的so
最后我们把生成好的 .so 和头文件 copy 整合到 Android 工程下,就可以开始做视频的开发了,至于怎么整合到 AS,留到下一篇吧,这一篇有点水,新手上路,就这样吧。
后面会一边代码实践一边介绍音视频的一些概念,编码、解码,音视频同步等等,慢慢来吧~