本文主要是演示如何在FFmpeg结合第三方开源库,一起编译FFmpeg,以rtmp为例子
准备:
FFmpeg4.2.2源码+rtmpdump-2.3源码
步骤:
注意第三方库也必须用NDK环境进行编译否则使用时会出现找不到方法等问题
1、编译ffmpeg所依赖的第三方库,本文为rtmp
- 按如下内容修改rtmpdump-2.3/librtmp中的Makefile中对应位置内容(注意rtmpdump-2.3中也有Makefile不要选错了!)
注意CFLAGS参数 -fPIC是Android平台必须的!!否则调用时会报错!
VERSION=v2.3
prefix=/usr/local
NDK=/Users/xxx/Library/Android/sdk/ndk/20.0.5594570
TOOLCHAIN=$(NDK)/toolchains/llvm/prebuilt/darwin-x86_64
API=21
#CC=$(CROSS_COMPILE)gcc
CC=${TOOLCHAIN}/bin/armv7a-linux-androideabi$(API)-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi${API}-clang++
LD=$(CROSS_COMPILE)ld
AR=$(CROSS_COMPILE)ar
SYS=posix
.......
.......
OPT=-O2
CFLAGS=-Wall $(XCFLAGS) $(INC) $(DEF) $(OPT) $(SO_DEF) --target=armv7-none-linux-androideabi${API}
--gcc-toolchain=/Users/xxx/Library/Android/sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/darwin-x86_64 -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables
-fstack-protector-strong -no-canonical-prefixes -fno-addrsig -march=armv7-a -mthumb -Wa,--noexecstack -Wformat -Werror=format-security
-O0 -fno-limit-debug-info -fPIC
.......
.......
- 在终端使用带参数的make命令进行rtmp编译,这里我们取消了ssl和加密支持(参数意义见rtmp源码中的README文档),成功后会生成.a文件
make CROSS_COMPILE=/Users/adam/Library/Android/sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-
INC=-I/Users/adam/Library/Android/sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/darwin-x86_64/sysroot SYS=posix XDEF=-DNO_SSL
CRYPTO= SHARED=
2、FFmpeg源码编译
- 首先需要让FFmpeg知道第三方库依赖在哪里,本文在FFmpeg-4.2.2源码目录创建了external文件夹,将上面生成的librtmp.a放入external\lib下,所有头文件放入external\include\librtmp文件中,这一步只是文件拷贝,ffmpeg还无法知道依赖库在哪。
-编辑ffmpeg中的configure文件,找到如下位置并修改,这样rtmp就知道依赖库的位置?
(因为编译时一直报pkg_config无法找到librtmp库导致链接rtmp失败错误,(通过rtmp 的make -参数 install,参数见上面编译,虽然可以将pkg_config所需的文件如.h、.a、.pc等拷贝到/usr/local/**相应目录,但仍会找不到,猜测估计可能与openssl等没开启,rtmp全功能未启用或者是还缺少一些文件有关,具体的后面有时间再去深究),所有换了一种寻找librtmp的方式,不是通过pkg_config工具自动到系统/user/local等目录去找($PKG_CONFIG_PATH可以查看pkg_config查找的目录),而是我们直接指定)
...
#enabled librtmp && require_pkg_config librtmp librtmp librtmp/rtmp.h RTMP_Socket
enabled librtmp && require librtmp librtmp/rtmp.h RTMP_Socket -L/Users/xxx/Downloads/FFmpeg-n4.2.2/external/lib -lrtmp
...
- 编写ffmpeg的bash编译脚本,可使用如下脚本,注意
--extra-cflags="-I/Users/xxx/Downloads/FFmpeg-n4.2.2/external/include $OPTIMIZE_CFLAGS"
--extra-ldflags="-L/Users/xxx/Downloads/FFmpeg-n4.2.2/external/lib -lrtmp"
#!/bin/bash
NDK=/Users/xxx/Library/Android/sdk/ndk/20.0.5594570
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
API=21
function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
--prefix=$PREFIX \
--disable-neon \
--disable-hwaccels \
--disable-gpl \
--disable-postproc \
--enable-jni \
--disable-mediacodec \
--disable-decoder=h264_mediacodec \
--disable-doc \
--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 \
--enable-librtmp \
--extra-cflags="-I/Users/xxx/Downloads/FFmpeg-n4.2.2/external/include $OPTIMIZE_CFLAGS" \
--extra-ldflags="-L/Users/xxx/Downloads/FFmpeg-n4.2.2/external/lib -lrtmp"
make clean
make
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}
#armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/armeabi-v7a
OPTIMIZE_CFLAGS="--target=armv7-none-linux-androideabi$API --gcc-toolchain=/Users/xxx/Library/Android/sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/darwin-x86_64 -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -march=armv7-a -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC"
build_android