音视频(1) - FFmpeg4.3.4编译

127 阅读1分钟

FFmpeg版本:4.3.4
NDK版本:r20b

NDK在r16之后将gcc编译器移除了,需要使用clang编译器。所以在配置脚本的时候需要设置编译器

configure中编译器参数配置:

--cc=clang路径 \
--cxx=clang++路径 \

修改文件ffmpeg/configure:

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)'

修改好后保存这样才符合android

比较重要的地方是要除了设置clang路径外还需要正确设置sysroot交叉编译根目录

完整的编译脚本配置:

#!/bin/bash
export NDK_HOME=NDK路径
export PLATFORM_VERSION=android-21
function build
{
echo "start build ffmpeg"
./configure \
--target-os=android \
--prefix=$PREFIX \
--arch=$ARCH \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--cc=$TOOLCHAIN/bin/$ARCH-linux-androideabi21-clang \
--cxx=$TOOLCHAIN/bin/$ARCH-linux-androideabi21-clang++ \
--enable-cross-compile \
--sysroot=$SYSROOT \
--enable-small \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "build ffmpeg for $ARCH finished"
}
#arm版本
ARCH=armv7a
CPU=armv7a
export PREFIX=$(pwd)/android/$ARCH
TOOLCHAIN=$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64
CROSS_COMPILE=$TOOLCHAIN/bin/$ARCH-linux-androideabi21-
ADDI_CFLAGS="-marm"
# SYSROOT=$NDK_HOME/platforms/$PLATFORM_VERSION/arch-arm/ 此这个交叉编译目录是ndk:r14
SYSROOT=$TOOLCHAIN/sysroot

build

较为重要的参数配置:

  • --target-os=android:目标设置为android
  • --cross-prefix=XXXX: 为编译工具指定路径
  • --cc=XXXX:指定使用何种C编译器(默认gcc)
  • -cxx=XXXX:add ECFLAGS to CXXFLAGS
  • --sysroot=XXXXX:置顶交叉编译根目录
  • --enable-shared:生成动态so库
  • --prefix=XXX:生成lib以及include文件存放在哪里