ffmpeg6.0编译(NDK)

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

相关推荐
企业数字化笔记3 小时前
视觉智能体怎么选技术?目标检测、跟踪、分割、OpenCV和FFmpeg的职责划分
opencv·目标检测·ffmpeg
企业数字化笔记1 天前
视频字幕如何烧录到成片?硬字幕、软字幕、样式控制与播放验收
java·ffmpeg
AIGC小尼2 天前
MiniMax-H3 8G 显存 AI 漫剧进阶实战|ComfyUI 命令行调参、角色锁定与 FFmpeg 批量脚本全解析
人工智能·ffmpeg·comfyui·ai漫剧
物极必反10242 天前
QT使用FFMpeg编译安卓程序.md
qt·ffmpeg·安卓
胡家伟++2 天前
从一段经文到 5 分半水墨动画短片:全 AI 流水线完整实录(即梦 + TTS 克隆 + ffmpeg + 思维链重构)
人工智能·ffmpeg·aigc
allnlei3 天前
Opus In-Band FEC 详解:原理、实现与开源方案
ffmpeg·音视频·gstreamer
VidDown3 天前
从一堆脚本到能维护的系统:视频处理管道的工程化
服务器·ffmpeg·音视频·视频编解码
FlightYe4 天前
视界原理之2D视频(二):视频文件里有什么
android·linux·网络·c++·ffmpeg·音视频·aac
可乐鸡翅yeah_4 天前
hls.js 切换多个视频源,新手开发常见踩坑
开发语言·前端·javascript·ios·ffmpeg·音视频·safari
程序员老陆4 天前
FFmpeg 日志级别深度解析:从 AV_LOG_ERROR 到 AV_LOG_TRACE 的完整指南
ffmpeg·音视频