本文记录Mac编译ffmpeg生成在Android上运行的so文件的过程。
ffmpeg下载相关的网址:https://www.ffmpeg.org/download.html
请尊重博主劳动成果,转载请标明原文出处和作者。
将ffmepg源码下载到本地:
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
默认的配置不支持Android平台,需要修改相关配置。
将3330至3333行注释,添加如下四行配置:
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
生成arm平台的so文件的脚本build_android_arm.sh内容:
#!/bin/bash
export TMPDIR=/xxx/xxx/video/ffmpeg/tmpDir
NDK=/xxx/xxx/android/android-ndk-r14b
SYSROOT=$NDK/platforms/android-14/arch-arm/
TOOLCHAIN=/xxx/xxx/android/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
CPU=arm
PREFIX=/Users/liu1359041/room/video/so/arm/
ADDI_CFLAGS="-marm"
ADDI_LDFLAGS=""
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--enable-small \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
build_one
讲解:
1,temp目录
export TMPDIR=/xxx/xxx/video/ffmpeg/tmpDir
TMPDIR为编译生成的临时文件存放的目录。
2,Android NDK安装目录
NDK=/xxx/xxx/android/android-ndk-r14b
3,so文件支持的最低Android版本的平台目录
SYSROOT=$NDK/platforms/android-14/arch-arm/
4,指定so文件支持的平台,PREFIX为生成的so文件存放目录
CPU=arm
PREFIX=/Users/liu1359041/room/video/so/arm/
5,Mac平台编译所使用的工具链目录
TOOLCHAIN=/xxx/xxx/android/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
6,配置编译所使用的工具链文件
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
将脚本build_android_arm.sh复制到ffmepg工程的根目录,运行终端,并进入到ffmepg工程目录,运行./build_android_arm.sh
。等待十几分钟,编译完成会在配置的存放的目录生成include和lib目录。include目录存放相关so的头文件(即.h文件),lib目录存放生成的so文件。
xxx-数字.so这些是真正的可执行文件,xx.so是链接。
如果编译过程出现了错误,基本上是build_android_arm.sh脚本中NDK相关的配置出现了错误。
生成x86平台的so文件的脚本build_android_x86.sh内容:
#!/bin/bash
export TMPDIR=/Users/liu1359041/room/video/tmpDir
NDK=/Users/liu1359041/devTools/android/android-ndk-r12b
SYSROOT=$NDK/platforms/android-14/arch-x86/
TOOLCHAIN=/Users/liu1359041/devTools/android/android-ndk-r12b/toolchains/x86-4.9/prebuilt/darwin-x86_64
CPU=x86
PREFIX=/Users/liu1359041/room/video/so/x86/
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--enable-small \
--disable-yasm \
--cross-prefix=$TOOLCHAIN/bin/i686-linux-android- \
--target-os=linux \
--arch=x86 \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
build_one
与生成arm平台的脚步基本相同,SYSROOT,TOOLCHAIN和–cross-prefix需要配置到x86相关的NDK编译目录。如果编译x86之前有先编译过arm的,需要删除生成的config.h文件。如果不删除,生成的so文件还是arm平台的,并会存放在arm目录中。
https://github.com/dxjia/ffmpeg-compile-shared-library-for-android
Mac下为Android编译FFMPEG和x264 (一)
http://zheteng.me/android/2016/05/25/build-ffmpeg-for-android-with-x264/