本文将会介绍:如何在 Docker 下为 Android 编译 FFMpeg 动态库。
1 前言
为什么使用 Docker
Docker 相当于一个虚拟机,类似于 Vmware Workstation。使用 Docker 可以充分保证(容器内)环境的一致性,减少不同环境的干扰。
基础概念
- 镜像(image):有过装系统经验的应该不难理解,
- 宿主机(host):运行 Docker engine 的环境,可以理解为你的电脑正在运行的系统(当然还包括硬件)。
- 容器(container):通过镜像创建的实体,一个镜像可以创建多个容器。
- 交叉编译(cross compile):通俗点说,是在一个架构的环境下,编译另一个架构下可以运行的目标文件(动态库、静态库、可执行文件等)。
2 环境
为确保之后的编译步骤顺畅进行,在此将我所使用的环境列出来:
- 镜像:ubuntu:18.04
- 宿主机:macOS Catalina 10.15.7
- FFMpeg 源码版本:5.0
- NDK 版本:23.1.7779620
理论上你应将除宿主机以外的环境跟笔者保持一致。
3 步骤
3.1 宿主机操作
创建容器
docker run -it -d ubuntu:18.04 /bin/bash
这条命令将会自动下载 ubuntu:18.04
镜像(如果本地没有),然后创建并进入该容器。
后续所有步骤/命令,均在容器内进行/执行。
3.2 容器内操作
3.2.1 更新软件源
cd ~ && apt update
进入容器的默认用户身份是
root
(默认当前路径是/
),因此执行命令不需要sudo
。
3.2.2 安装必要软件包
apt install build-essential curl zip openjdk-8-jdk vim -y
介绍下各软件包的作用:
build-essential
:Ubuntu 上基础编译软件的工具大集合。curl
:这里被用来下载文件。zip
:解压 zip 文件用的。openjdk-8-jdk
:部分 command line tools 需要 JAVA 环境才能执行。vim
:文本编辑。
3.2.3 准备 ffmpeg 源码
# 下载
curl -OL https://www.ffmpeg.org/releases/ffmpeg-5.0.tar.xz
# 解压
tar xvJf ffmpeg-5.0.tar.xz
3.2.4 准备 NDK
# 下载 Command Line Tools
curl -OL https://dl.google.com/android/repository/commandlinetools-linux-7583922_latest.zip
# 解压 Commmand Line Tools
unzip commandlinetools-linux-7583922_latest.zip
# 设置 android sdk 目录
mkdir -pv ~/.local/android
# 配置 Command Line Tools
mkdir -pv ~/.local/android/cmdline-tools/
mv ~/cmdline-tools ~/.local/android/cmdline-tools/latest
# 添加环境变量
echo "export PATH=$HOME/.local/android/cmdline-tools/latest/bin:$PATH" >> ~/.bashrc
# 使环境变量生效
source ~/.bashrc
# 安装 NDK,注意这里需要同意下协议!!
sdkmanager --install "ndk;23.1.7779620"
安装好的 NDK 将会在 $HOME/.local/android/ndk/23.1.7779620/
路径。
3.2.5 编译配置选项
ffmpeg 功能十分丰富,因而有相当多的配置选项,主要用于配置功能的开关,可以通过 ./configure --help
查看。
如果是线上环境使用,为了商业合规、控制包体积,我们需要根据开源协议、实际所需功能,进行裁剪。
此处主要目的是学习,因此将常用、尽可能多的功能打开。
ffmpeg 主要有以下几大模块:
libavcodec
:音视频的编解码库。libavdevice
:与多媒体设备交互的库。libavfilter
:滤波器库。音频的算法处理、视频的滤镜等等。libavformat
:多媒体文件的格式和协议的封装、解封库。如 mp4 文件格式,rtmp 网络协议。libavutil
:ffmpeg 里面的工具类libpostproc
:后处理库。libswresample
:重采样库。libswscale
:图像缩放、颜色空间和图像格式转换库。
# 切换到 ffmpeg 源码目录
cd ~/ffmpeg-5.0
# 创建编译脚本
vim compile_ffmpeg.sh
注意:自行了解 vim 使用。
以下是配置脚本内容。
#!/bin/bash
# filename: compile_ffmpeg.sh
set -e
API=29
OS=android
PREFIX="${pwd}/out/"
ARCH=arm64
CPU<