Android利用ndk(r22)编译ffmpeg-4.2.1
音视频高级教程 - Darren老师:QQ326873713
课程链接:https://ke.qq.com/course/468797?tuin=137bb271
前言
编译ffmpeg4.2.1 (当前官网为4.3.1,编译方法是一样的),用最新版的ndk(当前为r22)
编译支持 x264/fdk-aac/mp3
后续支持X265, opus。
采用clang编译器,而不是传统gcc
该文档先以armv8-a架构为例,其他架构只需要修改对应的CPU架构。
进一步的工作,优化编译参数,降低cpu占用率。
准备工作
准备以下编译环境:
- VMware Workstation 14.1.1 build-7528167
- Ubuntu 16.04
下载的FFmpeg源码和ndk放到同一个目录,比如/home/lqf/android,确定了目录后,后续在设置ndk路径的时候要参照该目录。
- 下载ffmpeg 4.2.1 压缩文件
(ubuntu系统自带FireFox浏览器)
ffmpeg4.2.1
http://ffmpeg.org/releases/ffmpeg-4.2.1.tar.bz2
最新的版本编译方式是一致的。

- 下载最新的ndk
NDKr22

下载:https://dl.google.com/android/repository/android-ndk-r22-linux-x86_64.zip
- 解压下载的两个文件
unzip android-ndk-r22-linux-x86_64.zip
tar jxf ffmpeg-4.2.1.tar.bz2

开始编译
编译fdk-aac
进入ffmpeg-4.2.1目录
cd ffmpeg-4.2.1
下载fdk-aac
git clone --depth 1 https://github.com/mstorsjo/fdk-aac.git
cd fdk-aac
配置编译脚本armv8-a_build.sh
#!/bin/bash
NDK=/home/lqf/android/android-ndk-r22
HOST_TAG=linux-x86_64
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG
ANDROID_LIB_PATH="$(pwd)/android"
API=21
./autogen.sh
function build_android_arm
{
echo "build for android $CPU"
./configure \
--host=$HOST \
--disable-shared \
--enable-static \
--prefix="$ANDROID_LIB_PATH/$CPU"
make clean
make -j8
make install
echo "building for android $CPU completed"
}
CPU=armv8-a
HOST=aarch64-linux-android
export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
export AS=$TOOLCHAIN/bin/aarch64-linux-android-as
export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
export CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
export CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
export CFLAGS="-Os -fpic $OPTIMIZE_CFLAGS"
export CPPFLAGS="-Os -fpic $OPTIMIZE_CFLAGS"
build_android_arm
增加执行权限
chmod +x armv8-a_build.sh
编译
执行脚本
./armv8-a_build.sh
报错

注释

报错

注释


继续执行
./armv8-a_build.sh
编译后的文件在
/home/lqf/android/ffmpeg-4.2.1/fdk-aac/android/armv8-a
注意自己的路径
编译x264
进入ffmpeg-4.2.1目录
cd ffmpeg-4.2.1
下载x264
git clone --depth 1 https://gitee.com/mirrors_addons/x264.git
配置编译脚本armv8-a_build.sh
进入x264
cd x264
编写编译脚本armv8-a_build.sh
#!/bin/bash
NDK=/home/lqf/android/android-ndk-r22
HOST_TAG=linux-x86_64
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG
ANDROID_LIB_PATH="$(pwd)/android"
API=21
function build_android_arm
{
echo "build for android $CPU"
./configure \
--host=$HOST \
--disable-shared \
--enable-static \
--prefix="$ANDROID_LIB_PATH/$CPU" \
--enable-pic \
--enable-strip \
--extra-cflags="-fPIC"
make clean
make -j8
make install
echo "building for android $CPU completed"
}
CPU=armv8-a
HOST=aarch64-linux-android
#export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
#export AS=$TOOLCHAIN/bin/aarch64-linux-android-as
#export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
#export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
#export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
export CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
export CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
build_android_arm
编译
执行脚本
./armv8-a_build.sh
编译后的文件在
/home/lqf/android/ffmpeg-4.2.1/x264/android/armv8-a
编译libmp3lame
进入ffmpeg-4.2.1目录
cd ffmpeg-4.2.1
下载libmp3lame
git clone --depth 1 https://gitee.com/hqiu/lame.git
配置编译脚本armv8-a_build.sh
配置编译脚本armv8-a_build.sh
#!/bin/bash
NDK=/home/lqf/android/android-ndk-r22
HOST_TAG=linux-x86_64
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG
ANDROID_LIB_PATH="$(pwd)/android"
API=21
function build_android_arm
{
echo "build for android $CPU"
./configure \
--host=$HOST \
--disable-shared \
--enable-static \
--prefix="$ANDROID_LIB_PATH/$CPU"
make clean
make -j8
make install
echo "building for android $CPU completed"
}
CPU=armv8-a
HOST=aarch64-linux-android
export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
export AS=$TOOLCHAIN/bin/aarch64-linux-android-as
export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
export CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
export CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
OPTIMIZE_CFLAGS="-march=$CPU"
export CFLAGS="-Os -fpic $OPTIMIZE_CFLAGS"
export CPPFLAGS="-Os -fpic $OPTIMIZE_CFLAGS"
build_android_arm
编译
执行脚本
./armv8-a_build.sh
编译后的文件在
/home/lqf/android/ffmpeg-4.2.1/lame/android/armv8-a
编译FFmpeg
替换最终生成的so文件名
进入ffmpeg-4.2.1
# 将ffmpeg-4.2.1目录中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)'
创建编译脚本文件
创建一个armv8-a_build.sh脚本文件用来进行编译工作
#!/bin/bash
NDK=/home/lqf/android/android-ndk-r22
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/
API=21
BASEPATH=$(cd `dirname $0`; pwd)
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 \
--extra-cflags="-I$X264_INCLUDE -I$FDK_INCLUDE -I$MP3_INCLUDE" \
--extra-ldflags="-L$FDK_LIB -L$X264_LIB -L$MP3_LIB" \
--enable-nonfree \
--enable-gpl \
--enable-libfdk-aac \
--enable-libx264 \
--enable-libmp3lame \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC
--cxx=$CXX
--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/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
#第三方库
FDK_INCLUDE=$BASEPATH/fdk-aac/android/$CPU/include
FDK_LIB=$BASEPATH/fdk-aac/android/$CPU/lib
X264_INCLUDE=$BASEPATH/x264/android/$CPU/include
X264_LIB=$BASEPATH/x264/android/$CPU/lib
MP3_INCLUDE=$BASEPATH/lame/android/$CPU/include
MP3_LIB=$BASEPATH/lame/android/$CPU/lib
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/linux-x86_64/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/linux-x86_64/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/linux-x86_64/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
编译
- 添加执行执行
chmod +x armv8-a_build.sh
- 执行编译文件
./armv8-a_build.sh
编译完成查看文件
在/ffmpeg-4.2.1/android/目录下
