ffmpeg 6.0 支持vulkan 需要手动安装Vulkan 并将include里面的vk_video 和 vulkan 拷贝到 android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/
vulkan 下载
bash
cp -r vk_video $NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/
cp -r vulkan $NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/
1 下载ffmpeg源码(网速差的可以直接传文件包到Linux上安装)
mkdir ffmpeg
cd ffmpeg
wget https://ffmpeg.org/releases/ffmpeg-6.0.tar.xz
2 解压
xz -d ffmpeg-6.0.tar.xz 先解压成xz -d ffmpeg-6.0.tar
tar -zxf ffmpeg-6.0.tar -C ./ 解压到当前目目录
3 下载NDK 版本 (r25c)
cd /home
mkdir ndk
cd ndk
wget https://dl.google.com/android/repository/android-ndk-r25c-linux.zip
4 解压
unzip android-ndk-r25c-linux.zip
5 配置环境
cd /etc/profile.d/
touch ndk.sh
vim ndk.sh 输入下面的内容保存并退出
bash
export NDK_ROOT=/home/ndk/android-ndk-r25c
export PATH=$NDK_ROOT:$PATH
激活配置:source /etc/profile
echo $NDK_ROOT 输出如图所示的结果说明配置成功
6开始配置编译文件并对ffmpeg进行编译
把ffmpeg源码编译成.so文件,可以供Android进行调用
第一步修改configure里面的配置
把
bash
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)'
修改为
bash
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
配置--cross-prefix-clang=PREFIX
bash
--cross-prefix=PREFIX use PREFIX for compilation tools [$cross_prefix]
# 这里添加
--cross-prefix-clang=PREFIX use PREFIX for compilation clang tools [$cross_prefix]
找到如图所示把cc_default="clang"改为cxx_default="clang++",如果用的是C语言可以不修改cross-prefix-clang前缀也添加上
bash
set_default target_os
if test "$target_os" = android; then
cc_default="clang"
# 这里修改 默认值
cxx_default="clang++"
fi
ar_default="${cross_prefix}${ar_default}"
cc_default="${cross_prefix}${cc_default}"
cxx_default="${cross_prefix}${cxx_default}"
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"
ranlib_default="${cross_prefix}${ranlib_default}"
strip_default="${cross_prefix}${strip_default}"
windres_default="${cross_prefix}${windres_default}"
添加编译脚本android_build.sh,添加权限chmod 777 android_build.sh,执行脚本 sh android_build.sh
#!/bin/bash
# 指定ndk路径
NDK=$NDK_HOME
# 指定平台路径
PLATFORM=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
# 指定交叉编译链
TOOLCHHAINS=$NDK/toolchains/llvm/prebuilt/linux-x86_64
#输出路径
PREFIX=./android
function build_android
{
echo "开始编译ffmpeg"
./configure \
--prefix=$PREFIX/$ABI \
--bindir=$PREFIX/$ABI/bin
--disable-postproc \
--disable-debug \
--disable-doc \
--enable-FFmpeg \
--disable-doc \
--disable-symver \
--disable-static \
--enable-shared \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp $OPTIMIZE_CFLAGS" \
--disable-vulkan \
--extra-ldflags="$ADDI_LDFLAGS"
make clean
make -j4
make install
echo "编译结束"
}
run_armv8
# armv7-a
function build_armv7()
{
API=28
ABI=armeabi-v7a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHHAINS/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHHAINS/bin/armv7a-linux-androideabi$API-clang++
CROSS_PREFIX=$TOOLCHHAINS/bin/arm-linux-androideabi-
# 编译
build_android
}
build_armv7
编译好的文件在当前目录的Android文件夹里面, 如果与prefix路径不匹配, 可以在ffbuild的config.log中查看prefix