NDK编译ffmpeg包含硬件加速vulkan和mediacodec
flyfish
ffmpeg:ffmpeg-6.0
NDK:android-ndk-r25c
硬件加速:vulkan 和 mediacodec
target CPU:armv8-a
host:Ubuntu 22.04
因为这里要编译硬件加速版本的ffmpeg-6.0,所以需要把vulkan中include下的两个文件夹
vk_video
和 vulkan
拷贝到 android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/
下
vulkan下载地址
Vulkan视频解码是厂商通用硬件加速视频解码的新规范。
目前,支持以下编解码器 H.264, HEVC, AV1
因为这里用的是android-ndk-r25c,与旧版的NDK有所不同
aarch64-linux-android-nm被llvm-nm替代
aarch64-linux-android-ar 被llvm-ar替代
编译脚本如下
#!/bin/bash
make clean
#配置NDK和TOOLCHAIN路径
export NDK=/media/a/flyfish/android_sdk/android-ndk-r25c
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
AR=$TOOLCHAIN/bin/llvm-ar
NM=$TOOLCHAIN/bin/llvm-nm
RANLIB=$TOOLCHAIN/bin/llvm-ranlib
STRIP=$TOOLCHAIN/bin/llvm-strip
#arm64-v8a 参数配置
ARCH=arm64
CPU=armv8-a
API=28
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"
function build_android
{
./configure \
--prefix=$PREFIX \
--enable-postproc \
--enable-debug \
--disable-asm \
--enable-doc \
--enable-ffmpeg \
--enable-ffplay \
--enable-ffprobe \
--enable-symver \
--disable-avdevice \
--enable-static \
--enable-shared \
--enable-neon \
--enable-hwaccels \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-decoder=hevc_mediacodec \
--enable-decoder=mpeg4_mediacodec \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--ar=$TOOLCHAIN/bin/llvm-ar \
--nm=$TOOLCHAIN/bin/llvm-nm \
--ranlib=$RANLIB \
--strip=$STRIP \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS"
make clean
make -j4
make install
echo "build complete"
}
# 函数调用
build_android
将上述脚本拷贝到build.sh
放置到ffmpeg-6.0中
增加可执行权限后,执行 ./build.sh
编译结果在ffmpeg-6.0/android//armv8-a
文件夹中
包括bin include lib share
将ffmpeg和so文件传到target设备
执行
第一句主要让ffmpeg从当前目录下找so文件
export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
./ffmpeg -hwaccels
可以看到已经包括vulkan和mediacodec硬件加速