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头文件放到工程项目里,就可以进行愉快地音视频开发了!