一,必要准备
一般需要在android手机上使用FFmpeg ,首先需要将将FFmpeg 编译为android 能使用的.so 文件(动态库)。所以我们首先需要准备:
1,编译环境——Windows,Mac OS,Linux……不同的系统在具体操作时可能会有所不同。以本文为例,锁使用的编译环境是在阿里云服务上搭建Ubuntu(Linux系统),大致配置如下(仅做学习使用):
2,FFmpeg源码。
源码下载地址
本文以ffmpeg-3.2.1.tar.gz版本为例 。
(以本文为例,登录阿里服务器后)定位到对应的文件目录下使用命令:
wget https://ffmpeg.org/releases/ffmpeg-3.2.1.tar.gz
下载源码并使用解压到当前目录,解压命令如下:
unzip ffmpeg-3.2.1.tar.gz
3,NDK
本文所使用的NDK版本是:android-ndk-r13b-linux-x86_64.zip。可以同样通过wget 和 unzip 命令下载并解压到对应的目录下(不用配置环境变量)。
注意:如果你想要以本文作为实践参照,请务必将你准备的FFmpeg源码和下载的ndk 版本与本文给出的保持一致,保持一致,保持一致。因为ffmpeg 个版本的改动,以及ndk 的版本改动,导致后续编译动态库时的配置参数会有所不同,加之FFmpeg 的中文学习资料有限(英文的又理解不了),所以的使用其他版本可能很有可能无法编译通过,至少我已经尝试过使用更新的版本进行编译......但最终还是放弃了......
二,配置文件
在具体编译动态库之前你还需要设置相应的编译规则。具体如下:
1,修改.so文件命名规则
默认编译后的.so文件格式为:文件明+.so+三段版本号的格式比如libavformat.so.57.0.101。这样的文件格式不太符合我们的使用要求,而且即便是将这样的文件名称简单粗暴的删除.so后面的版本号,在实际使用时也无法编译。所以修改如下:
定位到下载解压的ffmpeg 根目录下打开configure文件
vim configure
在大约3247行左右的地方
替换:
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)'
保存并退出。
注意:由于FFmpeg 的不同版本,这里所说的修改行号,以及 原
命名规则可能会有所部同。
2,编写编译(.sh)脚本
首先在ffmpeg 跟目录下创建build_android.sh(名称随意):
vim build_android.sh
(编辑状态下)编入以下内容:
#!/bin/bash
make clean
#填写你具体的ndk解压目录
export NDK=/android/ndk/android-ndk-r13b
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
#编译后的文件会放置在 当前路径下的android/arm/下
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
#./configure 即为ffmpeg 根目录下的可执行文件configure
#你可以在ffmpeg根目录下使用./configure --hellp 查看 ./configure后可填入的参数。
./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_CFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
保存并退出
注意:
–disable-yasm
1,在下文实际编译时可能会提示你需要安装yasm(在更早期的版本中没有这相关提示)。据说yasm时为了提高ffmpeg编译速度,但我实际感觉好想并没有多快,估计是我打开的方式不对吧。
2,上文中每行的编码结束后不要留空格。
3,确保NDK,SYSROOT,TOOLCHAIN 等相关变量存储的是你自己下载解压的ndk真实目录。并确认你的系统是32位还是64位——必须与ndk的版本保持一致。
三,编译生成.so文件
执行具体编译之前需要为build_android.sh文件添加的可执行权限。操作命令如下:
chmod +x build_android.sh
执行编译命令:
./build_android.sh
实际编译可能需要几分钟。
编译完成后,在当前目录下的android/arm/下会有inclue 和 lib两文件夹
inclue 存放的是相关模块的.h文件:
lib 存放的就是.so文件
原文地址:https://blog.youkuaiyun.com/longzw0/article/details/78820814