前言
音视频开发几乎离不开FFmpeg,从事音视频开发也有一段时间了,最近终于有时间可以把相关的知识重新梳理一遍了,第一篇就从FFmpeg编译开始吧。雷神真是可惜了,天妒英才。我们在忙于工作学习的时候,也要注意自己的身体。
准备工作
编译环境:
- Ubuntu 20.04.2 LTS
- ffmpeg-4.2.2
- android-ndk-r21e-linux-x86_64
编译
下载并解压完FFmpeg和NDK之后,就可以正式开始编译流程了。
-
第一步
切换到ffmpeg目录下
cd ffmpeg-4.2.2
效果如下图,可以看到ffmpeg的源码目录结构:
-
第二步
编写编译脚本build_android_clang.sh:
#!/bin/bash
export NDK=/usr/work/ndk/android-ndk-r21e #这里配置先你的 NDK 路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
function build_android
{
./configure \
--prefix=$PREFIX \
--enable-neon \
--enable-hwaccels \
--disable-postproc \
--disable-debug \
--enable-small \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-static \
--enable-shared \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS"
make clean
make -j16
make install
echo "============================ build android $CPU success =========================="
}
#arm64-v8a
ARCH=arm64
CPU=armv8-a
API=21
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
#armv7-a
ARCH=arm
CPU=armv7-a
API=21
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android
各种编译参数说明可以使用 ./configure --help查看。我这里分别编译了动态库和静态库,可以根据自己的需要修改*--enable-static和--enable-shared*
-
第三步
先给脚步加可执行权限
chmod +x build_android_clang.sh
开始运行编译脚本:
./build_android_clang.sh
等待一段时间,编译完成之后如图所示:
此时我们cd 到android目录可以看到已经生成的库文件:
到这里FFmpeg编译的流程就基本结束了,已经可以正式开始音视频开发了。
-
其他
目前编译的结果是多个单独的库文件,如下图:
其实也可以打包成一个动态库文件libffmpeg.so,打包的原理是将多个静态库打包成一个动态库,修改编译脚本:
--enable-static --disable-shared
打包脚本如下:
echo "开始编译ffmpeg so" export NDK=/usr/work/ndk/android-ndk-r21e #这里配置先你的 NDK 路径 PLATFORM=$NDK/platforms/android-21/arch-arm TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 PREFIX=$(pwd) $TOOLCHAIN/bin/arm-linux-androideabi-ld \ -rpath-link=$PLATFORM/usr/lib \ -L$PLATFORM/usr/lib \ -L$PREFIX/lib \ -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \ $PREFIX/libffmpeg.so \ libavcodec.a \ libavfilter.a \ libswresample.a \ libavformat.a \ libavutil.a \ libpostproc.a \ libswscale.a \ -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \ $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a \ echo "完成编译ffmpeg so"
然后到对应静态库目录下执行打包脚本,就不赘述啦。执行完成会生成libffmpeg.so动态库文件。