一,下载android NDK
从android官网下载NDK。下载地址:
NDK 下载 | Android NDK | Android Developers (google.cn)
本例android-ndk-r20b下载地址:
https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip?hl=zh-cn
下载后解压到linux环境,如目录:
/home/user/android-ndk-r20b
记得配置执行权限:
cd /home/user/android-ndk-r20b
chmod +x ./android-ndk-r20b -R
二,下载FFmpeg
可以从github下载:https://github.com/FFmpeg/FFmpeg
下载后解压到linux环境,如目录:
/home/user/ffmpeg20220808
chmod +x ./ffmpeg20220808 -R
三,编写交叉编译脚本
新建一个build_android_arm64.sh,内如复制粘贴用于arm64交叉编译脚本。放在目录
/home/user/ffmpeg20220808,记得
chmod+x build_android_arm64.sh
#!/bin/bash
############ndk dir ##################
export NDK=/home/user/android-ndk-r20b
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 \
--enable-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 success ====== "
}
######################### reserved for armv7-a ########################################
#ARCH=arm
#CPU=armv7-a
#API=29
#CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
#CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
#SYSROOT=$TOOLCHAIN/sysroot
#CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
#PREFIX=./out/target/$ARCH
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
#arm64-v8a
ARCH=arm64
CPU=armv8-a
#android 10
API=29
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=./out/target/$ARCH
OPTIMIZE_CFLAGS="-march=$CPU"
#start build
build_android
新建一个build_android_arm.sh,内如复制粘贴下面armv7的交叉编译脚本。放在目录
/home/user/ffmpeg20220808,记得
chmod+x build_android_arm.sh
#!/bin/bash
###############ndk dir ##################
export NDK=/home/user/android-ndk-r20b
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 \
--enable-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 success ====== "
}
######################### reserved for armv7-a ########################################
ARCH=arm
CPU=armv7-a
API=29
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=./out/target/$ARCH
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
#start build
build_android
注意,以上两个.sh 一定要修改 export NDK=/home/user/android-ndk-r20b到你自己的ndk目录。
另外,如果编译android 11等对应的android版本,可以修改API=30.
四,开始编译
在/home/user/ffmpeg20220808目录,运行两个脚本即可交叉编译:
./build_android_arm.sh
./build_android_arm64.sh
有其他配置修改,在函数 function build_android{}里面修改。编译产物在out/文件夹下。ffmpeg与ffprobe可执行文件,在当前目录。
五,验证
把编译后的与编译脚本.sh同级目录的 ffmpeg 通过adb push 到手机系统中:
adb remount
adb push ffmpeg /vendor/bin
adb push ffprobe /vendor/bin
把编译后的out/target/arm64/lib目录的全部so, 通过adb push 到手机文件系统/vendor/lib64中:
adb push Z:\ffmpeg20220808\out\target\arm64\lib\libavcodec.so Z:\ffmpeg20220808\out\target\arm64\lib\libavformat.so Z:\ffmpeg20220808\out\target\arm64\lib\libavfilter.so Z:\ffmpeg20220808\out\target\arm64\lib\libavutil.so Z:\ffmpeg20220808\out\target\arm64\lib\libpostproc.so Z:\ffmpeg20220808\out\target\arm64\lib\libswscale.so /vendor/lib64
可以在adb shell里面敲命令验证一下:
adb shell
ffmpeg -i /sdcard/111.mp4
ffprobe /sdcard/Dolls.mp4
六,编译静态可执行FFmpeg方法
由于编译动态加载的SO,可能跟项目其他版本的FFmpeg编译的so冲突,则可以修改configure来把so编译到bin一起。
function build_android() 删掉:
--enable-shared \
function build_android() 添加:
--pkg-config-flags="--static" \
--disable-shared \