1.准备环境
1)ubuntu18.04
2)安装ndk,我选择的版本是android-r20b,因为clang编译更友好😀
3)下载ffmpeg,点击这里,下载fdk_aac,点击这里,下载x264。这里要说明一下,ffmpeg对fdk_aac的版本是有要求的,比如我们最常用的ffmpeg 3.4.x匹配的版本在fdk_aac_0.1.6及之前版本,推荐0.1.6。如果是比较新的ffmpeg 4.x,那么推荐交叉编译的版本在fdk_aac_2.0.0及以后,推荐上最新。x264我实际测试没有版本限制。
4)下载ffmpeg之后解压到任意目录,推荐在home/用户名/ffmpeg3.4,进入ffmpeg3.4目录,首先修改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)'
运行./configure,会自动配置,可能会出现
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
这样的报错。
没关系,直接sudo apt-get install yasm。
再次运行./configure,成功生成配置文件。
5) 将fdk_aac以及x264压缩包文件解压至fmpeg3.4根目录下,分别命名为fdk-aac-0.1.6
和x264-master(也可以取其他名字,用这两个,后面就不需要修改脚本文件配置了)
工程目录如图所示,到这里已经成功一半了😀
6)在ffmpeg3.4根目录运行./build_android_all.sh,耐心等待,由于默认是全平台编译,所以会比较慢。如果你不需要所有平台的库,那么可以修改build_android_ffmpeg_all.sh中的红色字体部分
for arch in armeabi-v7a arm64-v8a x86 x86_64
do
bash build_android_fdkaac.sh $arch
done
缩小至自己需要的平台范围并再次执行./build_android_all.sh。
注:目前的ffmpeg已经不需要修改类似B0到b0的变量定义错误,应该是在更新中修复了。可以放心直接编译
别忘了最最重要的,贴出编译脚本:
build_android_all.sh
bash build_android_x264_all.sh
bash build_android_fdkaac_all.sh
bash build_android_ffmpeg_all.sh
build_android_x264_all.sh
for arch in armeabi-v7a arm64-v8a x86 x86_64
do
bash build_android_x264.sh $arch
done
build_android_x264.sh
#!/bin/bash
ARCH=$1
# 导入配置文件
source config.sh $ARCH
# 输出路径
LIBS_DIR=$(cd `dirname $0`; pwd)/libs/libx264
echo "LIBS_DIR="$LIBS_DIR
# x264源码路径
cd x264-master
export CC=$CC
export CXX=$CXX
export CXXFLAGS=$FF_EXTRA_CFLAGS
export CFLAGS=$FF_CFLAGS
export AR="${CROSS_PREFIX}ar"
export LD="${CROSS_PREFIX}ld"
export AS="${CROSS_PREFIX}as"
export NM="${CROSS_COMPILE}nm"
export STRIP="${CROSS_COMPILE}strip"
export RANLIB="${CROSS_COMPILE}ranlib"
PREFIX=$LIBS_DIR/$AOSP_ABI
export HOST=$HOST
export CROSS_PREFIX=$CROSS_PREFIX
export SYS_ROOT=$SYS_ROOT
export FF_CFLAGS=$FF_CFLAGS
./configure --prefix=$PREFIX \
--enable-static \
--enable-pic \
--disable-cli \
--disable-asm \
--host=$HOST \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$SYS_ROOT \
--extra-cflags="$FF_CFLAGS" \
--extra-ldflags=""
make clean
make -j2
make install
cd ..
build_android_fdkaac_all.sh
for arch in armeabi-v7a arm64-v8a x86 x86_64
do
bash build_android_fdkaac.sh $arch
done
build_android_fdkaac.sh
#!/bin/bash
ARCH=$1
source config.sh $ARCH
LIBS_DIR=$(cd `dirname $0`; pwd)/libs/libfdk-aac
#fdk-aac源码路径
cd fdk-aac-0.1.6
PREFIX=$LIBS_DIR/$AOSP_ABI
echo "PREFIX="$PREFIX
export CC="$CC"
export CXX="$CXX"
export CFLAGS="$FF_CFLAGS"
export CXXFLAGS="$FF_EXTRA_CFLAGS"
# x86架构源码中使用了math库所以必须链接
export LDFLAGS="-lm"
export AR="${CROSS_PREFIX}ar"
export LD="${CROSS_PREFIX}ld"
export AS="${CROSS_PREFIX}as"
./configure \
--prefix=$PREFIX \
--target=android \
--with-sysroot=$SYS_ROOT \
--enable-static \
--disable-shared \
--host=$HOST
make clean
make -j2
make install
cd ..
build_android_ffmpeg_all.sh
# x86 x86_64
for arch in armeabi-v7a arm64-v8a x86 x86_64
do
bash build_android_ffmpeg.sh $arch
done
bash build_android_ffmpeg.sh
#!/bin/bash
ARCH=$1
source config.sh $ARCH
NOW_DIR=$(cd `dirname $0`; pwd)
LIBS_DIR=$NOW_DIR
# 输出路径
PREFIX=$LIBS_DIR/android/$AOSP_ABI
# 头文件目录
FDK_INCLUDE=$LIBS_DIR/libs/libfdk-aac/$AOSP_ABI/include
# 库文件目录
FDK_LIB=$LIBS_DIR/libs/libfdk-aac/$AOSP_ABI/lib
X264_INCLUDE=$LIBS_DIR/libs/libx264/$AOSP_ABI/include
X264_LIB=$LIBS_DIR/libs/libx264/$AOSP_ABI/lib
./configure \
--target-os=android \
--prefix=$PREFIX \
--enable-cross-compile \
--disable-runtime-cpudetect \
--disable-asm \
--arch=$AOSP_ARCH \
--cc=$CC \
--cxx=$CXX \
--cross-prefix=$CROSS_PREFIX \
--extra-cflags="-I$X264_INCLUDE -I$FDK_INCLUDE $FF_CFLAGS" \
--extra-cxxflags="$FF_EXTRA_CFLAGS" \
--extra-ldflags="-L$X264_LIB -L$FDK_LIB" \
--extra-libs=-lm \
--sysroot=$SYS_ROOT \
--disable-static \
--enable-shared \
--enable-jni \
--enable-mediacodec \
--enable-pic \
--enable-gpl \
--disable-indev=v4l2 \
--enable-libx264 \
--enable-nonfree \
--enable-neon \
--enable-libfdk_aac
make clean
make -j4
make install
完结撒花.....