主要目的:通过ffmpeg,利用脚本打出属于自己的音视频处理so库。
1、下载ffmpeg的源码
官网地址:http://www.ffmpeg.org/download.html
里面有Linux、macOS、Windows系统的版本,根据自己的需要下载对应的版本。下载完成后把源码放在你喜欢的路径,如:/Users/ccc/ffmpeg
2、 安装Androidstudio
官网地址: https://developer.android.google.cn/studio
3、下载NDK
这个NDK不需要另外下载,直接在AndroidStudio里面的SDK Manager里面下载就行。顺便把CMake也装上,这个也有用。
到这里,需要的工具基本齐了,下面开始编译自己的so库。
4、经常看到网上其他的文章介绍,接下来都是修改configure文件,怎么改?为什么要改?不改行不行?
怎么改:在configure文件中,搜索Toolchain options,增加一个自定义的参数配置。
Toolchain options:
--arch=ARCH select architecture [$arch]
--cpu=CPU select the minimum required CPU (affects
instruction selection, may crash on older CPUs)
--cross-prefix=PREFIX use PREFIX for compilation tools [$cross_prefix]
# 增长这一行
--cross-prefix-clang=PREFIX use PREFIX for compilation tools [$cross_prefix_clang]
--progs-suffix=SUFFIX program name suffix []
--enable-cross-compile assume a cross-compiler is used
--sysroot=PATH root of cross-build tree
再搜索CMDLINE_SET,也增加上面的自定义参数配置。
CMDLINE_SET="
$PATHS_LIST
ar
arch
as
assert_level
build_suffix
cc
objcc
cpu
cross_prefix
#增长这一行
cross_prefix_clang
custom_allocator
cxx
dep_cc
最后再搜索set_default target_os,进行一下修改:
set_default target_os
if test "$target_os" = android; then
cc_default="clang"
# 增长这一行
cxx_default="clang++"
fi
ar_default="${cross_prefix}${ar_default}"
# 修改这一行
cc_default="${cross_prefix_clang}${cc_default}"
# 修改这一行
cxx_default="${cross_prefix_clang}${cxx_default}"
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"
ranlib_default="${cross_prefix}${ranlib_default}"
strip_default="${cross_prefix}${strip_default}"
windres_default="${cross_prefix}${windres_default}"
sysinclude_default="${sysroot}/usr/include"
这样修改之后咱们在编译时就可使用咱们新增的cross_prefix_clang参数了,而后其余的如nm,ar,ranlib,strip则继续使用cross_prefix参数。
为什么要这样改?
首先,需要先了解编译库的流程。
①编写自定义的编译脚本
②脚本根据各个配置项,去寻找对应的库工具路径
③生成动态链接库
而上面的修改,目的就是为了第二步能正常找到对应的库工具。配置中的nm,ar,ranlib,strip这些的前缀,是arm-linux-androideabi-,而cc,cxx这两个是arm-linux-androideabi21-这样的前缀,而且他们放的位置也不一样。所以增加一个自定义的配置项,用于指向不同的目录。
图中的-clang和-clang++前面,都是跟版本的,nm,ar,ranlib,strip就不是,如果我们不修改configure文件里的配置项,就会编译失败。
编写编译脚本
在ffmepg的文件夹中新建一个文件夹build-android,里面再新建一个build-android.sh文件。
#!/bin/bash
#NDK路径
export NDK=/Users/chenjy/Library/Android/sdk/ndk/20.0.5594570
#CPU类型
export CPU=armv7-a
# 目标Android版本
API=19
#架构类型
export ARCH=arm
export SYSROOT=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot
#交叉编译工具链
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
#编译成功后,存放的路径
export PREFIX=./build-android/dist
cd .. #回到ffmpeg根目录
echo "start configure"
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--cross-prefix-clang=$TOOLCHAIN/bin/armv7a-linux-androideabi21- \
--target-os=android --arch=$ARCH --cpu=$CPU \
--enable-gpl --enable-version3 \
--disable-programs --disable-ffmpeg --disable-ffplay --disable-ffprobe \
--disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages \
--disable-avdevice --disable-postproc --disable-avfilter \
--disable-debug \
--sysroot=$SYSROOT \
--extra-cflags="-I$SYSROOT/usr/include" \
--extra-ldflags="-L$SYSROOT/usr/lib" \
--enable-small \
--enable-jni \
--enable-mediacodec
--disable-everything \
--enable-decoder=hevc --enable-decoder=h264 --enable-decoder=aac \
--enable-parser=h264 --enable-parser=hevc --enable-parser=aac \
--enable-demuxer=flv --enable-demuxer=mov --enable-demuxer=avi --enable-demuxer=mpegts \
--enable-protocol=file --enable-protocol=hls
echo "make clean start"
make clean
echo "make start"
make -j4
echo "make finished"
make install
echo "make install finished"
打开终端,转到脚本文件的所在路径,然后输入./build-android.sh,然后等待编译完成,就能在输出路径中找到所有的链接库。到这里为止,就已经编译出我们需要的so库了,之后就是怎么在android项目中使用了。这个会在以后的文章中进行记录。
还有一个问题,就是能不能不修改configure文件?
其实也是可以,只需要明确指定cc和cxx的路径就行。
--cc=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang \
--cxx=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++ \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
脚本部分配置项解释
1.—prefix:指定编译输出的文件路径
2.—target-os:指定目标操作系统
3.--disable-static:禁止生成静态库
4.—disable-programs:禁止生成ffplay、ffmpeg等可执行文件
5.—disable-doc:禁止生成文档
6.—enable-shared:生成动态链接库
7.enable-cross-compile:开启交叉编译(跨平台编译)
8.make -j12:定义用几个CPU编译