Mac:FFmpeg+rtmp NDK编译

本文主要是演示如何在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

你可能感兴趣的:(Mac:FFmpeg+rtmp NDK编译)