android 11 NDK交叉编译静态ffmpeg方法

一,下载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 \ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值