ffmpeg学习:ubuntu下编译Android版ffmpeg-kit

文章目录

  • 前言
  • 一. 配置环境
    • 1.1 虚拟机版本
    • 1.2 安装Android环境
      • 1.2.1 Android SDK安装
      • 1.2.2 Android NDK安装
    • 1.3 编译前的准备工作
      • 1.3.1 libtasn1-1安装
      • 1.3.2 meson安装
      • 1.3.3 harfbuzz下载
  • 二. 编译ffmpeg-kit
  • 三. 总结

前言

ffmpeg-kit是一款跨多个平台的,用于在应用程序中运行FFprobe相关命令的库。只可惜的是这款优秀的开源框架的作者最近表示后续不再维护Saying Goodbye to FFmpegKit。
由于公司需要在ffmeg上增加gl-transitions,同时公司用到了ffmpeg-kit。因此,不得不手动编译一个FFmpegKit。

一. 配置环境

1.1 虚拟机版本

我选择的是VirtualBox来安装虚拟机,虚拟机建议用7.0.14版本。镜像文件是ubuntu-20.04.4-desktop-amd64.iso,下载地址我用的是网易开源镜像:ubuntu-releases-20.04。(建议使用20.04以上的iso镜像文件)

1.2 安装Android环境

在经过漫长的虚拟机安装等待后,安装好最基本的vim,可以参考之前的文章ffmpeg学习:ubuntu下编译ffmpeg(全网最懒的编译脚本) 。
通过以下命令更新软件库:

# 更新源文件,并不会做任何安装升级操作
apt-get update

# 升级所有已安装的包
apt-get upgrade

完成上面的操作,那么接下来就是安装Android SDK和Android NDK了。

1.2.1 Android SDK安装

在安装AndroidSDK之前先检查是否安装好JDK,ubuntu20.04.4没有预置JDK。
当你在命令行中输入jdk的时候会有如下提示:

找不到命令“jdk”,您的意思是:
  command 'juk' from snap juk (24.12.1)
  command 'jd' from deb jdim (0.3.0-1build1)
  command 'juk' from deb juk (4:19.12.3-1)
  command 'jdb' from deb openjdk-11-jdk-headless (11.0.24+8-1ubuntu3~20.04)
  command 'jdb' from deb openjdk-13-jdk-headless (13.0.7+5-0ubuntu1~20.04)
  command 'jdb' from deb openjdk-16-jdk-headless (16.0.1+9-1~20.04)
  command 'jdb' from deb openjdk-17-jdk-headless (17.0.12+7-1ubuntu2~20.04)
  command 'jdb' from deb openjdk-21-jdk-headless (21.0.4+7-1ubuntu2~20.04)
  command 'jdb' from deb openjdk-8-jdk-headless (8u422-b05-1~20.04)

我这里根据当前虚拟机系统选择的是openjdk-17-jdk-headless,其中headless代表缺少显示设备,键盘或鼠标的系统配置。AndroidSDK和JDK版本间的关系如下:
在这里插入图片描述
(该图来自官网Android build 中的 Java 版本)

完成JDK的安装,接下来就可以安装AndroidSDK了,之所以用到AndroidSDK是因为后续要打包成arr,此时必须使用到AndroidSDK。

Android SDK的安装,我用的是命令行工具,下载地址:命令行工具。直接拉到最底部,可以看到仅限命令行工具
仅限命令行工具

选择linux的最新版本。下载到本地,注意需要通过以下步骤处理:(参考Android官网sdkmanager文档 )

  1. 从 Android Studio 页面下载最新的命令行工具软件包,然后解压缩该软件包。
  2. 将解压缩的 cmdline-tools 目录移至您选择的新目录,例如 android_sdk。这个新目录就是您的 Android SDK 目录。
  3. 在解压缩的 cmdline-tools 目录中,创建一个名为 latest 的子目录。
  4. 将原始 cmdline-tools 目录内容(包括 lib 目录、bin 目录、NOTICE.txt 文件和 source.properties 文件)移动到新创建的 latest 目录中,现在,您就可以从这个位置使用命令行工具了。

在这一切都做好后,我通过’cp’命令将其拷贝到/opt目录下。我的建议是最好先在home目录下完成,包括NDK。
先通过sdkmanager命令查看

sdkmanager --list

使用sdkmanager命令下载platform-tools,platforms,build-tools

sdkmanager "platform-tools" "platforms;android-33" "build-tools;33.0.1"

以上的命令如果出现权限问题,请先在AndroidSDK目录上增加权限:

sudo chmod -R 777 XXXX/

对于权限问题(类似 Warning: Failed to read or create install properties file.),个人以为最好的解决方法是AndroidSDK和NDK就放在home目录下。
接下来配置AndroidSDK环境,使用命令:

vim ~/.bashrc

用vim命令打开.bashrc,然后输入下面两条语句

# 配置AndroidSDK环境
export ANDROID_SDK_ROOT=/opt/program-tools/AndroidSDK
export PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin

上面的ANDROID_SDK_ROOT改成你自己的SDK路径。
然后执行

source ~/.bashrc

1.2.2 Android NDK安装

和上面的SDK安装一样先下载,再配置环境,但是这里需要选对版本,参考ffmpeg-kit的issues
#292,下载版本为25.2.9519653 (SHA1值 53af80a1cce9144025b81c78c8cd556bff42bd0e),下载完成后直接解压拷贝到相对应的目录下。
配置环境的步骤和上面一样:

# 配置AndroidNDK环境
export ANDROID_NDK_ROOT=/opt/program-tools/AndroidSDK/ndk/25.2.9519653
export PATH=$PATH:$ANDROID_NDK_ROOT

运行

source ~/.bashrc

通过命令

ndk-build -v

出现类似于以下的提示,就成功了

GNU Make 4.3
为 x86_64-pc-linux-gnu 编译
Copyright (C) 1988-2020 Free Software Foundation, Inc.
许可证:GPLv3+:GNU 通用公共许可证第 3 版或更新版本<http://gnu.org/licenses/gpl.html>。
本软件是自由软件:您可以自由修改和重新发布它。
在法律允许的范围内没有其他保证。

至此,完成了万里长征的第一步。

1.3 编译前的准备工作

参考该文章Building中的Android-Prerequisites
通过apt-get命令下载以下依赖
构建脚本需要以下包

autoconf automake libtool pkg-config curl git doxygen nasm

仅当您要构建相应的外部库时才需要安装这些可选包

cmake gcc gperf texinfo yasm bison autogen wget autopoint meson ninja ragel groff gtk-doc-tools libtasn1-1

备注

libsndfile 需要autogen
bison > 2.4,wget,gnutls 需要自动点
libwebp 和 x265 需要cmake > 3.9
freetype 和 fribidi 需要gcc
fontconfig 需要gperf
libiconv 需要groff
gnutls 需要gtk-doc-tools
gnutls 所需的libtasn1-1
meson > 0.56,dav1d 的忍者
harfbuzz 要求ragel
某些平台上 gmp 需要texinfo
某些平台上 libvpx 和 x265 需要yasm

这些依赖包太多了,一个个的敲键盘太累,那么我们可以用shell脚本解决

#! /bin/bash

set -e

sudo apt-get update && \
sudo apt-get -y --allow-change-held-packages full-upgrade && \
sudo apt-get -y install \
  	autoconf\
  	automake\
 	libtool\
 	pkg-config\
 	curl\
 	git\
 	doxygen\
 	nasm

 sudo apt-get update && \
 sudo apt-get -y --allow-change-held-packages full-upgrade && \
 sudo apt-get -y install \
 	cmake\
 	gcc\
 	gperf\
 	texinfo\
 	yasm\
 	bison\
 	autogen\
 	wget\
 	autopoint\
 	meson\
 	ninja-build\
 	ragel\
 	groff\
 	gtk-doc-tools

通过该shell脚本可以下载大部分依赖包,其中有两个依赖包需要注意libtasn1-1meson

1.3.1 libtasn1-1安装

libtasn1-1的作用:

libtasn1-1 是一个用于处理 ASN.1 编码和解码的库。ASN.1(抽象语法标记语言)是一种描述数据结构的标准,广泛用于通信协议(如 SSL/TLS 和 X.509 证书)中。libtasn1 库提供了对 ASN.1 数据的解析和编码的支持。

我的ubuntu-20.04.4无法安装libtasn1-1,这就意味着在编译开启 –enable-gnutls的ffmpeg时候会出现问题。可以通过如下步骤来解决(参考文档)
命令如下:

# 下载解压
wget http://ftp.gnu.org/gnu/libtasn1/libtasn1-4.20.0.tar.gz && tar -xzvf libtasn1-4.20.0.tar.gz && cd libtasn1-4.20.0 
# 编译
./configure --prefix=/usr --disable-static 
make clean
make 
# 安装
sudo make install

配置libtasn1输入以下命令

# 管理员身份
sudo -s
echo /usr/lib >> /etc/ld.so.conf && ldconfig

以下是chatgpt输出的:
命令 echo /usr/lib >> /etc/ld.so.conf && ldconfig 的作用是将 /usr/lib 路径添加到动态链接器的配置文件中,并刷新链接器的缓存。让我们逐个分解它的含义:
命令的功能:

  1. echo 命令会将字符串 /usr/lib 输出到标准输出。
  2. >> 是重定向操作符,它会将输出追加到指定的文件中。在这里,/etc/ld.so.conf 是动态链接器的配置文件,记录了动态库的路径。
  3. 这条命令会将 /usr/lib 路径追加到 /etc/ld.so.conf 文件的末尾。如果这个目录没有被列出,动态链接器在查找共享库时可能会找不到它。
  4. ldconfig 是一个用于更新系统中的共享库缓存的命令。它会扫描 ld.so.conf 中列出的所有目录,并建立一个缓存,以加快后续的库查找。
  5. 当你修改了共享库路径(例如,添加了新的库目录),需要运行 ldconfig 来更新系统缓存。

再在bashrc中输入:

LIBTASN1_CFLAGS="-I/usr/include" 
LIBTASN1_LIBS="-L/usr/lib -ltasn1"

执行命令:

source ~/.bashrc

1.3.2 meson安装

我的ubuntu-20.04.4下载的meson最新版是0.53,需要重新安装0.58.1以上的meson,我的因为这个在编译的时候会报错(高版本的估计没有):

meson.build:25:0: ERROR: Could not invoke sanity test executable: [Errno 8] Exec format error: 'XXXXXX/.tmp/cmake/build/android-arm64/dav1d/meson-private/sanitycheckc.exe'.

参考文章:
issues52

解决方案是通过pip3去安装meson
参考:
ubuntu 20.04 安装与升级 meson 的版本
首先通过apt-get安装pip3

sudo apt install python3-pip

安装好pip3后,再通过以下命令安装

pip3 install meson==0.58.1

使用meson -v命令显示版本0.58.1,代表安装成功。

1.3.3 harfbuzz下载

我在编译的过程中,发现一个问题,那就是harfbuzz无法clone下来。同样的,如果遇到此类问题,建议通过ffmpeg-kit的代码来查看,找到ffmpeg-kit/scripts/source.sh的代码。
其中部分代码:

 harfbuzz)
    SOURCE_REPO_URL="https://github.com/arthenica/harfbuzz"
    SOURCE_ID="8.0.1"
    SOURCE_TYPE="TAG"
    ;;

可以看出需要下载的是https://github.com/arthenica/harfbuzz的tag8.0.1的源码,但是不知道为啥无法下载,所以我这里就手动下载了harfbuzz-8.0.1

二. 编译ffmpeg-kit

经过上面的准备工作,可以正式进入编译环节了。
首先克隆ffmpeg-kit

git clone git@github.com:arthenica/ffmpeg-kit.git

进入到目录下,执行 ./android.sh可以得到最基础的不会打开任何依赖项的ffmpeg。
如果需要打开需要的依赖项,可以参考这篇文章安卓脚本

拿full-gpl所依赖的扩展程序来说,通过chat-gpt给出的功能作用如下:

dav1d: 这是 AV1 视频编解码器的解码器,FFmpeg 使用它来解码 AV1 格式的视频流。

fontconfig: 字体配置库,用于处理字体管理,尤其在渲染字幕时。

freetype: 一个开源的字体渲染库,用于在视频中添加文本或字幕。

fribidi: 用于支持阿拉伯语和其他从右到左书写的语言,处理文本排版。

gmp: 大整数计算库,通常用于处理高精度的数学运算(如加密、数字签名等)。

gnutls: 安全传输协议库(TLS/SSL),为 FFmpeg 提供加密功能,支持安全的视频流传输。

kvazaar: 高效的 HEVC/H.265 编解码器,用于视频编码。

lame: MP3 编解码器库,允许 FFmpeg 编码和解码 MP3 格式的音频。

libass: 用于字幕渲染,特别是 ASS/SSA 字幕格式。

libiconv: 字符集转换库,帮助 FFmpeg 处理不同编码格式的文本。

libilbc: iLBC(Internet Low Bitrate Codec)编解码器,常用于 VoIP(语音通信)。

libtheora: 开源的视频编解码器,支持 Theora 格式视频。

libvorbis: 一种开源音频编解码器,常用于 Ogg 格式的音频。

libvpx: VP8/VP9 编解码器,Google 开发的用于视频流媒体的格式。

libwebp: WebP 图像格式的支持库,用于处理 WebP 格式的图片。

libxml2: XML 解析库,FFmpeg 用它来解析和处理 XML 数据,通常在处理流媒体协议时使用。

opencore-amr: AMR(Adaptive Multi-Rate)音频编解码器,通常用于语音编码(例如移动通信中的语音通话)。

opus: Opus 音频编解码器,广泛用于实时语音通信和高质量音频压缩。

shine: MP3 编解码器库,较为轻量,用于较低复杂度的 MP3 编码。

snappy: 数据压缩库,常用于快速压缩和解压数据。

soxr: 高质量的音频重采样库,提供高精度的音频频率转换。

speex: 一个开源音频编解码器,优化了语音压缩,适用于低比特率的语音通信。

twolame: MP2 编解码器,常用于广播和音频文件编码。

vid.stab: 视频稳定库,帮助减少视频中的抖动和不稳定画面。

vo-amrwbenc: AMR-WB(宽带自适应多速率)音频编码器,通常用于更高质量的语音编码。

x264: 开源的 H.264 视频编码器,广泛应用于视频流媒体和存储。

x265: HEVC(H.265)视频编码器,提供比 H.264 更高的视频压缩效率。

xvidcore: Xvid 编解码器库,用于 MPEG-4 视频压缩。

zimg: 高质量的图像缩放库,支持多种图像缩放算法,主要用于提高视频处理中的图像质量。

如果要是编译符合full-gpl的ffmpeg-kit,需要如下命令,这里我直接用脚本编写好了。

#! /bin/bash

# --disable-arm-v7a --disable-arm-v7a-neon --disable-x86 --disable-x86-64 --disable-arm64-v8a

set -e

./android.sh --enable-android-media-codec --enable-android-zlib \
	--enable-dav1d \
	--enable-fontconfig \
	--enable-freetype \
	--enable-fribidi \
	--enable-gmp \
	--enable-gnutls \
	--enable-kvazaar \
	--enable-lame \
	--enable-libass \
	--enable-libiconv \
	--enable-libilbc \
	--enable-libtheora \
	--enable-libvorbis \
	--enable-libvpx \
	--enable-libwebp \
	--enable-libxml2 \
	--enable-opencore-amr \
	--enable-opus \
	--enable-shine \
	--enable-snappy \
	--enable-soxr \
	--enable-speex \
	--enable-twolame \
	--enable-vo-amrwbenc \
	--enable-zimg \
	--enable-gpl --enable-libvidstab --enable-x264 --enable-x265 --enable-xvidcore \
	--disable-arm-v7a --disable-arm-v7a-neon --disable-x86 --disable-x86-64

上面的命令直接保存后,再通过 ./xxx.sh来执行。
当出现Creating Android archive under prebuilt: ok就代表编译成功。
需要注意的是,在使用这个手动打包获取的arr的时候,需要在自己的Android项目中的gradle脚本中引入:

// 手动打包需要自己手动添加下面的代码
api 'com.arthenica:smart-exception-java:0.1.1'

三. 总结

后续将基于该项目,尝试将gl-transition移植到ffmpeg中。编译的结果可以通过ffmpeg-kit-test来测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968556.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【全球人口数据集】全球人口密度数据集GPWv4

目录 数据概述数据处理方法数据下载参考GPWv4: Population Density, Revision 11 是由 NASA Socioeconomic Data and Applications Center (SEDAC) 提供的全球人口密度数据集,旨在支持社会经济和环境研究。 数据概述 Gridded Population of the World, Version 4 (GPWv4): Po…

PyTorch 中 `torch.cuda.amp` 相关警告的解决方法

在最近的写代码过程中&#xff0c;遇到了两个与 PyTorch 的混合精度训练相关的警告信息。这里随手记录一下。 警告内容 警告 1: torch.cuda.amp.autocast FutureWarning: torch.cuda.amp.autocast(args...) is deprecated. Please use torch.amp.autocast(cuda, args...) i…

NLP面试之-激活函数

一、动机篇 1.1 为什么要有激活函数&#xff1f; 数据角度&#xff1a;由于数据是线性不可分的&#xff0c;如果采用线性化&#xff0c;那么需要复杂的线性组合去逼近问题&#xff0c;因此需要非线性变换对数据分布进行重新映射;线性模型的表达力问题&#xff1a;由于线性模型…

四、自然语言处理_08Transformer翻译任务案例

0、前言 在Seq2Seq模型的学习过程中&#xff0c;做过一个文本翻译任务案例&#xff0c;多轮训练后&#xff0c;效果还算能看 Transformer作为NLP领域的扛把子&#xff0c;对于此类任务的处理会更为强大&#xff0c;下面将以基于Transformer模型来重新处理此任务&#xff0c;看…

关于conda换镜像源,pip换源

目录 1. 查看当前下载源2. 添加镜像源2.1清华大学开源软件镜像站2.2上海交通大学开源镜像站2.3中国科学技术大学 3.删除镜像源4.删除所有镜像源&#xff0c;恢复默认5.什么是conda-forge6.pip换源 1. 查看当前下载源 conda config --show channels 如果发现多个 可以只保留1个…

因果机器学习(CausalML)前沿创新思路

结合了传统因果推断与机器学习的因果机器学习是目前AI领域的前沿研究方向&#xff0c;其核心优势在于将因果逻辑融入数据驱动模型&#xff0c;从根本上解决了传统方法的缺陷。因此&#xff0c;它也是突破传统机器学习瓶颈的关键方向&#xff0c;不仅当下热度高&#xff0c;在未…

网络防御高级02-综合实验

web页面&#xff1a; [FW]interface GigabitEthernet 0/0/0 [FW-GigabitEthernet0/0/0]service-manage all permit 需求一&#xff0c;接口配置&#xff1a; SW2: [Huawei]sysname SW2 1.创建vlan [sw2]vlan 10 [sw2]vlan 20 2.接口配置 [sw2]interface GigabitEther…

【devops】 Git仓库如何fork一个私有仓库到自己的私有仓库 | git fork 私有仓库

一、场景说明 场景&#xff1a; 比如我们Codeup的私有仓库下载代码 放入我们的Github私有仓库 且保持2个仓库是可以实现fork的状态&#xff0c;即&#xff1a;Github会可以更新到Codeup的最新代码 二、解决方案 1、先从Codeup下载私有仓库代码 下载代码使用 git clone 命令…

一竞技瓦拉几亚S4预选:YB 2-0击败GG

在2月11号进行的PGL瓦拉几亚S4西欧区预选赛上,留在欧洲训练的YB战队以2-0击败GG战队晋级下一轮。双方对阵第二局:对线期YB就打出了优势,中期依靠卡尔带队进攻不断扩大经济优势,最终轻松碾压拿下比赛胜利,以下是对决战报。 YB战队在天辉。阵容是潮汐、卡尔、沙王、隐刺、发条。G…

ATF系统安全从入门到精通

CSDN学院课程连接&#xff1a;https://edu.csdn.net/course/detail/39573

Linux内核实时机制x - 中断响应测试 Cyclictest分析1

Linux内核实时机制x - 中断响应测试Cyclitest 1 实时性测试工具 rt-test 1.1 源码下载 1.下载源码&#xff1a; ~/0-code/5.15$ git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git 正克隆到 rt-tests... remote: Enumerating objects: 5534, done. remot…

实现限制同一个账号最多只能在3个客户端(有电脑、手机等)登录(附关键源码)

如上图&#xff0c;我的百度网盘已登录设备列表&#xff0c;有一个手机&#xff0c;2个windows客户端。手机设备有型号、最后登录时间、IP等。windows客户端信息有最后登录时间、操作系统类型、IP地址等。这些具体是如何实现的&#xff1f;下面分别给出android APP中采集手机信…

如何获取,CPU,GPU,硬盘,网卡,内存等硬件性能监控与各项温度传感器

首先需要下载 OpenHardwareMonitorServer 这是一个基于OpenHardwareMonitor 的 Web 服务器。可以让任何语言都可以获取硬件信息和值&#xff0c;OpenHardwareMonitorServer 是没有UI界面的因此它可以当成控制台程序使用。 该程序可用参数如下 参数&#xff1a;需要管理员权限…

解锁大语言模型潜能:KITE 提示词框架全解析

大语言模型的应用日益广泛。然而&#xff0c;如何确保这些模型生成的内容在AI原生应用中符合预期&#xff0c;仍是一个需要不断探索的问题。以下内容来自于《AI 原生应用开发&#xff1a;提示工程原理与实战》一书&#xff08;京东图书&#xff1a;https://item.jd.com/1013604…

C++STL容器之map的使用及复现

map 1. 关联式容器 vector、list、deque、forward_list(C11) 等STL容器&#xff0c;其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身&#xff0c;这样的容器被统称为序列式容器。而 map、set 是一种关联式容器&#xff0c;关联式容器也是用来存储数据的&#xf…

网络工程师 (30)以太网技术

一、起源与发展 以太网技术起源于20世纪70年代&#xff0c;最初由Xerox公司的帕洛阿尔托研究中心&#xff08;PARC&#xff09;开发。最初的以太网采用同轴电缆作为传输介质&#xff0c;数据传输速率为2.94Mbps&#xff08;后发展为10Mbps&#xff09;&#xff0c;主要用于解决…

30天开发操作系统 第 20 天 -- API

前言 大家早上好&#xff0c;今天我们继续努力哦。 昨天我们已经实现了应用程序的运行, 今天我们来实现由应用程序对操作系统功能的调用(即API, 也叫系统调用)。 为什么这样的功能称为“系统调用”(system call)呢&#xff1f;因为它是由应用程序来调用(操作)系统中的功能来完…

Java面试题及答案整理( 2023年 6 月最新版,持续更新)

秋招金九银十快到了&#xff0c;发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全~ 这套互联网 Java 工程师面试题包括了&#xff1a;MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java面试、Spring、微服务、Linux、Spri…

查询语句来提取 detail 字段中包含 xxx 的 URL 里的 commodity/ 后面的数字串

您可以使用以下 SQL 查询语句来提取 detail 字段中包含 oss.kxlist.com 的 URL 里的 commodity/ 后面的数字串&#xff1a; <p><img style"max-width:100%;" src"https://oss.kxlist.com//8a989a0c55e4a7900155e7fd7971000b/commodity/20170925/20170…

管式超滤膜分离技术都可以应用到哪些行业?

管式超滤膜分离技术由于其高效、稳定和适应性强的特点&#xff0c;在多个行业都有广泛的应用&#xff1a; 1. 生物制药与医药行业 纯化与浓缩&#xff1a;在生物药品的下游处理阶段&#xff0c;管式超滤膜被用来纯化抗体、疫苗、蛋白质等生物大分子&#xff0c;通过精确筛选分子…