Android开发之——Ubuntu下编译FFmpeg生成.so文件
前言
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。市面上常见的播放器如:暴风影音、QQ影音、KMP、GOM Player、PotPlayer等都使用了该开源项目。
编译
本文主要讲述在Ubuntu下,使用开源项目FFmpeg编译成.so文件。本文只讲实际动手操作,更多理论知识稍后补充或者自己搜索了解。
使用前准备
- make
- git
- NDK(android-ndk-r14b-linux-x86_64.zip)
- FFmpeg(ffmpeg-3.2.1.tar.gz)
- Ubuntu系统
集成步骤
安装make
安装make,后面编译时会用到
安装Git
习惯了使用Git,也可以使用Terminal操作
NDK
我曾经使用过NDK R15C,编译不过,后来改为 NDK R14,为保证成功,建议使用 NDK R14
NDK 下载
下载地址
NDK 解压
使用 unzip 指令解压NDK到指定目录
FFMPEG
下载FFmpeg
使用下面的指令下载ffmpeg3.2.1(我曾尝试过ffmpeg4.0版本,因为一些列元音未编译成功)
wget https://ffmpeg.org/releases/ffmpeg-3.2.1.tar.gz
解压FFmpeg
使用解压指令解压FFmpeg
unzip ffmpeg-3.2.1.tar.gz
修改配置文件
默认编译后的.so文件格式为:文件明+.so+三段版本号的格式比如libavformat.so.57.0.101。这样的文件格式不太符合我们的使用要求,而且即便是将这样的文件名称简单粗暴的删除.so后面的版本号,在实际使用时也无法编译。所以修改如下
修改前
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)'
编写编译(.sh)脚本
创建编译脚本
在ffmpeg 跟目录下创建build_android.sh(名称随意):
创建后,脚本如下所示:
创建build文件目录(android)
android 文件夹用于存放build后的.so文件和其他文件
修改编译脚本内容
#!/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
编译运行
修改.sh脚本文件权限
没有限权,后面的脚本命令无法执行
运行.sh脚本
脚本执行过程
编译完成
编译时间较长 20分钟左右,之后在android目录下,可以看到生成的文件