最详细的ffmpeg编译so教程(mac os)

2,538 阅读3分钟

1、配置ndk环境

下载ndk路径:developer.android.google.cn/ndk/downloa…

开始配置环境(该教程在mac os下完成):

打开终端,依次输入如下命令行,打开环境配置文件.bash_profile:

   touch ./.bash_profile
   open ./.bash_profile

在打开.bash_profile文件后,在里面配置ndk环境变量,具体如下:

export NDK_HOME=/Users/xhkj/Library/Android/sdk/ndk/20.0.5594570
export PATH=${PATH}:${NDK_HOME}

NDK_HOME:是ndk的根目录路径。这里要根据自己的实际路径来。 写入成功后,记得保存哦!!!

接下来,我们需要将刚刚配置ndk环境生效,所以,需要在终端输入如下命令行:

source ./.bash_profile

到此,ndk环境配置完毕。

2、开始ffmpeg编译操作

我们先从github上把ffmpeg源代码下载下来: github.com/FFmpeg/FFmp…

源码下载完成后,我们先要对源码里面的configure文件配置里的一些参数进行修改。如果不修改的话,编译出来的动态库文件名的版本号会出现在.so之后(例如:“libavcodec.so.5.100.1”),这样子的命名,在Android平台上是不能识别的,所以要对其进行修改。 这里,我们直接找到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)'

接下来也就是比较麻烦的一步。。。。 编写编译脚本build_android.sh文件 这里提供一个样例,具体一些里面的内容是根据configure文件里的配置决定,大家以后有啥特别需求自己查看configure,里面有啥骚姿势可以解锁的,就看你们了!嘿嘿

#!/bin/bash 
NDK=/Users/xhkj/Library/Android/sdk/ndk/20.0.5594570 
TOOLCHAIN_ROOT_DIR=darwin-x86_64
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$TOOLCHAIN_ROOT_DIR/
API=29 
#要编译的ffmpeg内容方法
function build_android {
	echo "Compiling FFmpeg for $CPU" 
	./configure \
	--prefix=$PREFIX \
	--disable-neon \
	--disable-hwaccels \
	--disable-gpl \
	--disable-postproc \
	--enable-shared \
	--enable-jni \
	--disable-mediacodec \
	--disable-decoder=h264_mediacodec \
	--disable-static \
	--disable-doc \
	--disable-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" \
	$ADDITIONAL_CONFIGURE_FLAG 
	make clean 
	make 
	make install 
	echo "The Compilation of FFmpeg for $CPU is completed" 
}
#接下来是根据需要来决定
#armv8-a 
ARCH=arm64 
CPU=armv8-a 
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang 
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++ 
SYSROOT=$NDK/toolchains/llvm/prebuilt/$TOOLCHAIN_ROOT_DIR/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 
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang 
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++ 
SYSROOT=$NDK/toolchains/llvm/prebuilt/$TOOLCHAIN_ROOT_DIR/sysroot 
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi- 
PREFIX=$(pwd)/android/$CPU 
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm - march=$CPU " 
build_android 
#x86 
ARCH=x86 
CPU=x86 
CC=$TOOLCHAIN/bin/i686-linux-android$API-clang 
CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++ 
SYSROOT=$NDK/toolchains/llvm/prebuilt/$TOOLCHAIN_ROOT_DIR/sysroot 
CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android- 
PREFIX=$(pwd)/android/$CPU 
OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 - mfpmath=sse -m32" 
build_android 
#x86_64 
ARCH=x86_64 
CPU=x86-64 
CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang 
CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++ 
SYSROOT=$NDK/toolchains/llvm/prebuilt/$TOOLCHAIN_ROOT_DIR/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android- 
PREFIX=$(pwd)/android/$CPU 
OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 - mtune=intel" 
build_android

⚠️注意:这里除了ndk路径需要改之外,TOOLCHAIN也可能是不固定的,具体会根据ndk不同版本而有所不同,这里教大家一个比较准确的方式,我们可以去新建一个ndk项目,然后去查看编译的debug文件夹下的CMakeCache.txt文件,可以找到如下:

红色框框里就是我们所要的TOOLCHAIN变量所要的相对路径。

最最最后一步,就是在终端里执行build_android.sh脚本文件。

得到的so库都会在当前目录下的android文件夹里面。

至此,已经完成了ffmpeg编译,我们只需要将相应的abi的so库和调用的h头文件放到工程项目里,就可以进行愉快地音视频开发了!