1、前言
编译环境的说明:
1. make
2. git
3. NDK(android-ndk-r14b-linux-x86_64.zip)
4. FFmpeg(ffmpeg-3.2.1.tar.gz)
5. Ubuntu系统
2、编译环境准备
2.1 环境安装
(1)安装make,后面编译时会用到:
sudo apt-get install make
(2)安装GIT
先安装起来,虽然本次没有使用,后面会继续使用
sudo apt-get install make
(3)NDK的选择
NDK R15、R16-beta版本都验证过,编译不过,各种奇怪的错误,后来改为 NDK R14,为保证成功,建议使用 NDK R14
NDK 下载地址: 下载地址
NDK 解压: 使用 unzip 指令解压NDK到指定目录
(4)FFMPEG的选择
使用下面的指令下载ffmpeg3.2.1(我曾尝试过ffmpeg4.0版本,因为一些列元音未编译成功)
wget https://ffmpeg.org/releases/ffmpeg-3.2.1.tar.gz
使用解压指令解压FFmpeg
unzip ffmpeg-3.2.1.tar.gz
2.2 修改配置文件
默认编译后的.so文件格式为:文件明+.so+三段版本号的格式比如libavformat.so.57.0.101。这种的文件格式不太符合我们的使用要求,而且即便是将这样的文件名称简单粗暴的删除.so后面的版本号,在实际使用时也无法编译。所以修改如下
修改前
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)'
2.3 编写编译(.SH)脚本
创建编译脚本
在ffmpeg 根目录下创建build_ffmpeg.sh(名称随意): 定位到FFmpeg路径下,使用命令 touch build_ffmpeg.sh 即可创建文件
创建后,脚本如下所示:
修改编译脚本内容
#!/bin/bash
make clean
#填写你具体的ndk解压目录
export NDK=/android/ndk/android-ndk-r13b
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
#编译后的文件会放置在 当前路径下的android/arm/下
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
#./configure 即为ffmpeg 根目录下的可执行文件configure
#你可以在ffmpeg根目录下使用./configure --hellp 查看 ./configure后可填入的参数。
./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_CFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
2.4 编译运行
1、修改.SH脚本文件权限,保证脚本可以正常执行
chmod +x build_ffmpeg.sh
2、运行.SH脚本
./build_ffmpeg.sh
3、开始进行编译
2.5 编译完成
编译时间较长 20分钟左右,之后在android目录下,可以看到生成的文件
3 FFmpeg重新编译
更新于2023-2.4号下午
前面的编译过程,虽然编译通过了,但是里面不含有静态文件.a,所以这里再次进行了尝试,找到比较新的NDK和FFmpeg版本。
主要过程还是参考这篇文章juejin.cn/post/720317…,替换下面一些资源即可
1、替换ndk、ffmpeg版本
1、android-ndk-r20b-linux-x86_64
2、ffmpeg-4.2.2
2、替换脚本build_ffmpeg.sh
#!/bin/bash
export NDK=/home/vivo/download/android-ndk-r20b-linux-x86_64/android-ndk-r20b #这里配置先你的 NDK 路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
function build_android
{
./configure \
--prefix=$PREFIX \
--enable-neon \
--enable-hwaccels \
--enable-gpl \
--disable-postproc \
--disable-debug \
--enable-small \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-static \
--enable-shared \
--disable-doc \
--enable-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"
make clean
make -j16
make install
echo "============================ build android arm64-v8a success =========================="
}
#arm64-v8a
ARCH=arm64
CPU=armv8-a
API=21
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"
build_android
编译成功后会在 android 目录下生成对应六个模块的静态库和动态库
另外,若要编译成 32 位的库,则需修改对应的编译脚本:
#armv7-a
ARCH=arm
CPU=armv7-a
API=21
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 "
至此,编译部分完成了