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

文章目录

  • 前言
  • [一. 配置环境](#一. 配置环境)
    • [1.1 虚拟机版本](#1.1 虚拟机版本)
    • [1.2 安装Android环境](#1.2 安装Android环境)
      • [1.2.1 Android SDK安装](#1.2.1 Android SDK安装)
      • [1.2.2 Android NDK安装](#1.2.2 Android NDK安装)
    • [1.3 编译前的准备工作](#1.3 编译前的准备工作)
      • [1.3.1 libtasn1-1安装](#1.3.1 libtasn1-1安装)
      • [1.3.2 meson安装](#1.3.2 meson安装)
      • [1.3.3 harfbuzz下载](#1.3.3 harfbuzz下载)
  • [二. 编译ffmpeg-kit](#二. 编译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(全网最懒的编译脚本)

通过以下命令更新软件库:

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

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

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

1.2.1 Android SDK安装

在安装AndroidSDK之前先检查是否安装好JDK,ubuntu20.04.4没有预置JDK。

当你在命令行中输入jdk的时候会有如下提示:

bash 复制代码
找不到命令"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命令查看

bash 复制代码
sdkmanager --list

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

bash 复制代码
sdkmanager "platform-tools" "platforms;android-33" "build-tools;33.0.1"

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

bash 复制代码
sudo chmod -R 777 XXXX/

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

接下来配置AndroidSDK环境,使用命令:

bash 复制代码
vim ~/.bashrc

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

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

上面的ANDROID_SDK_ROOT改成你自己的SDK路径。

然后执行

bash 复制代码
source ~/.bashrc

1.2.2 Android NDK安装

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

配置环境的步骤和上面一样:

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

运行

bash 复制代码
source ~/.bashrc

通过命令

bash 复制代码
ndk-build -v

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

bash 复制代码
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命令下载以下依赖
构建脚本需要以下包

bash 复制代码
autoconf automake libtool pkg-config curl git doxygen nasm

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

bash 复制代码
cmake gcc gperf texinfo yasm bison autogen wget autopoint meson ninja ragel groff gtk-doc-tools libtasn1-1

备注

bash 复制代码
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脚本解决

bash 复制代码
#! /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时候会出现问题。可以通过如下步骤来解决(参考文档)

命令如下:

bash 复制代码
# 下载解压
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输入以下命令

bash 复制代码
# 管理员身份
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中输入:

bash 复制代码
LIBTASN1_CFLAGS="-I/usr/include" 
LIBTASN1_LIBS="-L/usr/lib -ltasn1"

执行命令:

bash 复制代码
source ~/.bashrc

1.3.2 meson安装

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

bash 复制代码
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

bash 复制代码
sudo apt install python3-pip

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

bash 复制代码
pip3 install meson==0.58.1

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

1.3.3 harfbuzz下载

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

其中部分代码:

bash 复制代码
 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](https://github.com/arthenica/harfbuzz/releases/tag/8.0.1)

二. 编译ffmpeg-kit

经过上面的准备工作,可以正式进入编译环节了。

首先克隆ffmpeg-kit

bash 复制代码
git clone [email protected]:arthenica/ffmpeg-kit.git

进入到目录下,执行 ./android.sh 可以得到最基础的不会打开任何依赖项的ffmpeg。

如果需要打开需要的依赖项,可以参考这篇文章安卓脚本

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

bash 复制代码
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,需要如下命令,这里我直接用脚本编写好了。

bash 复制代码
#! /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脚本中引入:

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

三. 总结

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

相关推荐
Ares-Wang2 小时前
Linux》Ubuntu》Docker >>安装中文版GitLab compose
linux·ubuntu·docker
_君莫笑4 小时前
Ubuntu上部署Flask+MySQL项目
mysql·ubuntu·flask
69岁老同志程序员4 小时前
Ubuntu下管理多个GCC版本
linux·ubuntu
年轮不改9 小时前
Ubuntu 配置 ffmpeg 开发环境
linux·ubuntu·ffmpeg
编程小小白白10 小时前
Jetson Orin NX jupyter lab的安装和使用
linux·ubuntu·jupyter
高高山上立10 小时前
【组件安装】Ubuntu 22.04.5 desktop 安装 Anyware Agent
ubuntu·hp anyware
乙龙10 小时前
在麒麟系统(基于Ubuntu或Debuntu)的离线环境中创建本地APT仓库
linux·运维·ubuntu·kylin
程序员黄同学12 小时前
解释 TypeScript 中的枚举(enum),如何使用枚举定义一组常量?
javascript·ubuntu·typescript
upDiff14 小时前
ubuntu测试指定文件夹的读写速度
linux·ubuntu