FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。

首先下载Ffmpeg 源码:

​https://ffmpeg.org/​

我下载的是 4.2.2 最新;

请注意,不同的版本,编译可能会遇到不同的问题;

NDK 环境  android-ndk-r17c

下载:​​https://developer.android.google.cn/ndk/downloads/​

三、配置NDK环境变量

  • 1.在命令行中输入​​vim ~/.bash_profile​
  • 2.添加NDK环境
#NDK_ROOT换成自己NDK路径
export NDK_ROOT=/Users/Android/android-ndk-r17c
export PATH=${PATH}:${NDK_ROOT}

四、修改Ffmpeg 目录下configure文件

用vim打开,用命令行​​/​​​查找​​SLIBNAME_WITH_MAJOR​​以快速定位

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

在ffmpeg解压后的文件夹下,新建文件 build_andriod.sh

#!/bin/bash

ADDI_CFLAGS="-marm"
API=19
PLATFORM=arm-linux-androideabi
CPU=x86_64 # 'armeabi-v7a' 'x86_64'
NDK=/Users/xxx/android/android-ndk-r17c # 修改成自己本地的ndk路径。
SYSROOT=$NDK/platforms/android-$API/arch-arm/
ISYSROOT=$NDK/sysroot
ASM=$ISYSROOT/usr/include/$PLATFORM
TOOLCHAIN=$NDK/toolchains/$PLATFORM-4.9/prebuilt/darwin-x86_64
export TMPDIR=$(pwd)/tmp
OUTPUT=$(pwd)/android/$CPU #自己指定一个输出目录,用来放生成的文件的。
function build
{
echo "开始编译ffmpeg"

./configure \
--prefix=$OUTPUT \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=android \
--arch=armeabi-v7a \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I$ASM -isysroot $ISYSROOT -Os -fpic -marm" \
--extra-ldflags="-marm" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
# 这里是定义用几个CPU编译,我用4个,一般在5分钟之内编译完成
make -j4
make install

echo "编译结束!"
}

build

六. 编译

打开终端,进入 Ffmpeg 目录下,ls -l build_android.sh这个命令查看到当前文件没有可执行权限,添加权限chmod a+x build_android.sh

运行当前文件./build_android.sh

编译编译成功后,生成三个文件夹分别为include(头文件)、lib(.so动态库)、share

七. 遇到问题:

arm-linux-androideabi-clang is unable to create an executable

打开相应目录,果真不存在,不过这个一看就知道是更高版本才会有的,Android 默认是 clang ,不再是gcc

解决方案:

修改Ffmpeg 目录下configure文件

4210 行 clang 改为 gcc

set_default target_os
if test "$target_os" = android; then
cc_default="clang"
fi

编译成功;
 

多架构 方案脚本 需要添加NDK位置(未验证)

#!/bin/sh

PREFIX=android-build
HOST_PLATFORM=linux-x86_64

COMMON_OPTIONS="\
--target-os=android \
--disable-static \
--enable-shared \
--enable-small \
--disable-programs \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--disable-asm \
--enable-decoder=vorbis \
--enable-decoder=opus \
--enable-decoder=flac
"

build_all(){
for version in armeabi-v7a arm64-v8a x86 x86_64; do
echo "======== > Start build $version"
case ${version} in
armeabi-v7a )
ARCH="arm"
CPU="armv7-a"
CROSS_PREFIX="$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/$HOST_PLATFORM/bin/arm-linux-androideabi-"
SYSROOT="$NDK_HOME/platforms/android-21/arch-arm/"
EXTRA_CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=softfp -mvectorize-with-neon-quad"
EXTRA_LDFLAGS="-Wl,--fix-cortex-a8"
;;
arm64-v8a )
ARCH="aarch64"
CPU="armv8-a"
CROSS_PREFIX="$NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/$HOST_PLATFORM/bin/aarch64-linux-android-"
SYSROOT="$NDK_HOME/platforms/android-21/arch-arm64/"
EXTRA_CFLAGS=""
EXTRA_LDFLAGS=""
;;
x86 )
ARCH="x86"
CPU="i686"
CROSS_PREFIX="$NDK_HOME/toolchains/x86-4.9/prebuilt/$HOST_PLATFORM/bin/i686-linux-android-"
SYSROOT="$NDK_HOME/platforms/android-21/arch-x86/"
EXTRA_CFLAGS=""
EXTRA_LDFLAGS=""
;;
x86_64 )
ARCH="x86_64"
CPU="x86_64"
CROSS_PREFIX="$NDK_HOME/toolchains/x86_64-4.9/prebuilt/$HOST_PLATFORM/bin/x86_64-linux-android-"
SYSROOT="$NDK_HOME/platforms/android-21/arch-x86_64/"
EXTRA_CFLAGS=""
EXTRA_LDFLAGS=""
;;
esac

echo "-------- > Start clean workspace"
make clean

echo "-------- > Start config makefile"
configuration="\
--prefix=${PREFIX} \
--libdir=${PREFIX}/libs/${version}
--incdir=${PREFIX}/includes/${version} \
--pkgconfigdir=${PREFIX}/pkgconfig/${version} \
--arch=${ARCH} \
--cpu=${CPU} \
--cross-prefix=${CROSS_PREFIX} \
--sysroot=${SYSROOT} \
--extra-ldexeflags=-pie \
${COMMON_OPTIONS}
"

echo "-------- > Start config makefile with ${configuration}"
./configure ${configuration}

echo "-------- > Start make ${version} with -j8"
make j8

echo "-------- > Start install ${version}"
make install
echo "++++++++ > make and install ${version} complete."

done
}

echo "-------- Start --------"
build_all
echo "-------- End --------"