1. 引言
本流程适用于在 Ubuntu 22.04 PC 上使用 aarch64-linux-gnu- 交叉编译工具链,编译支持 Rockchip MPP 硬件加速的 FFmpeg,并部署到 RK3568 开发板。
2. 环境准备
2.1 安装依赖
bash
sudo apt update
sudo apt install -y git pkg-config yasm build-essential
2.2 安装 ARM64 内核头文件
bash
sudo apt install -y linux-libc-dev-arm64-cross
2.3 创建工作目录
bash
mkdir -p ~/ffmpeg_build
cd ~/ffmpeg_build
3. 克隆源码
bash
git clone -b jellyfin-mpp --depth=1 https://github.com/nyanmisaka/mpp.git rkmpp
git clone --depth=1 https://github.com/nyanmisaka/ffmpeg-rockchip.git ffmpeg
4. 编译 MPP 库
bash
cd ~/ffmpeg_build/rkmpp/build/linux/aarch64
# 修改 mpp_dmabuf.c 使用绝对路径
sed -i 's|#include <linux/dma-buf.h>|#include "/usr/aarch64-linux-gnu/include/linux/dma-buf.h"|' ~/ffmpeg_build/rkmpp/osal/mpp_dmabuf.c
# 清理缓存(首次可跳过)
rm -rf CMakeCache.txt CMakeFiles
# 编译
./make-Makefiles.bash
# 安装到临时目录
make install DESTDIR=~/ffmpeg_build/mpp_install PREFIX=/usr
5. 准备 libdrm 依赖(关键差异点)
5.1 下载 Ubuntu 20.04 的 ARM64 libdrm 包
bash
cd ~/ffmpeg_build
mkdir -p drm_pkg && cd drm_pkg
wget http://ports.ubuntu.com/ubuntu-ports/pool/main/libd/libdrm/libdrm2_2.4.107-8ubuntu1~20.04.2_arm64.deb
wget http://ports.ubuntu.com/ubuntu-ports/pool/main/libd/libdrm/libdrm-dev_2.4.107-8ubuntu1~20.04.2_arm64.deb
5.2 解压并复制库文件
bash
dpkg-deb -x libdrm2_2.4.107-8ubuntu1~20.04.2_arm64.deb tmp_drm2
dpkg-deb -x libdrm-dev_2.4.107-8ubuntu1~20.04.2_arm64.deb tmp_drm_dev
sudo mkdir -p /usr/aarch64-linux-gnu/lib
sudo mkdir -p /usr/aarch64-linux-gnu/include/drm
sudo cp tmp_drm2/usr/lib/aarch64-linux-gnu/libdrm.so.2.4.0 /usr/aarch64-linux-gnu/lib/
sudo cp tmp_drm2/usr/lib/aarch64-linux-gnu/libdrm.so.2 /usr/aarch64-linux-gnu/lib/
cd /usr/aarch64-linux-gnu/lib
sudo ln -sf libdrm.so.2.4.0 libdrm.so
cd ~/ffmpeg_build/drm_pkg
sudo cp tmp_drm_dev/usr/include/libdrm/*.h /usr/aarch64-linux-gnu/include/drm/
5.3 创建 pkg-config 文件
bash
sudo mkdir -p /usr/aarch64-linux-gnu/lib/pkgconfig
sudo tee /usr/aarch64-linux-gnu/lib/pkgconfig/libdrm.pc <<'EOF'
prefix=/usr/aarch64-linux-gnu
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${exec_prefix}/include
Name: libdrm
Description: Direct Rendering Manager
Version: 2.4.107
Libs: -L${libdir} -ldrm
Cflags: -I${includedir} -I${includedir}/drm
EOF
6. 修正 MPP 的 pkg-config 文件
bash
sed -i 's|^prefix=.*|prefix=/home/heqingchun/ffmpeg_build/mpp_install/usr/local|' ~/ffmpeg_build/mpp_install/usr/local/lib/pkgconfig/rockchip_mpp.pc
sed -i 's|^libdir=.*|libdir=${prefix}/lib|' ~/ffmpeg_build/mpp_install/usr/local/lib/pkgconfig/rockchip_mpp.pc
sed -i 's|^includedir=.*|includedir=${prefix}/include|' ~/ffmpeg_build/mpp_install/usr/local/lib/pkgconfig/rockchip_mpp.pc
7. 编译 FFmpeg
7.1 设置 pkg-config 环境变量
bash
export PKG_CONFIG_LIBDIR=/usr/aarch64-linux-gnu/lib/pkgconfig:$HOME/ffmpeg_build/mpp_install/usr/local/lib/pkgconfig
7.2 配置 FFmpeg
bash
cd ~/ffmpeg_build/ffmpeg
make distclean 2>/dev/null
bash
./configure \
--prefix=/usr \
--enable-cross-compile \
--arch=aarch64 \
--target-os=linux \
--cross-prefix=aarch64-linux-gnu- \
--enable-gpl \
--enable-version3 \
--enable-rkmpp \
--enable-libdrm \
--disable-indev=kmsgrab \
--enable-shared \
--disable-static \
--extra-cflags="-I/usr/aarch64-linux-gnu/include" \
--extra-ldflags="-L/usr/aarch64-linux-gnu/lib" \
--pkg-config=pkg-config
7.3 编译与安装
bash
make -j$(nproc)
make install DESTDIR=~/ffmpeg_build/ffmpeg_install
8. 打包
bash
cd ~/ffmpeg_build
tar -czf ffmpeg.tar.gz -C ffmpeg_install/usr bin lib include
tar -czf mpp.tar.gz -C mpp_install/usr/local lib include
9. 部署到开发板
bash
scp ffmpeg.tar.gz mpp.tar.gz user@开发板IP:~
在开发板上执行:
bash
sudo tar -xzf ~/mpp.tar.gz -C /usr/local
sudo tar -xzf ~/ffmpeg.tar.gz -C /usr/local
sudo ldconfig
# 配置 PATH 和权限
echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
sudo usermod -a -G video $USER # 重新登录生效
10. 验证
bash
ffmpeg -hwaccels | grep rkmpp
ffmpeg -hwaccel rkmpp -i test.mp4 -f null -
安装libz
1. 创建临时目录并进入
bash
mkdir -p ~/ffmpeg_build/zlib_pkg && cd ~/ffmpeg_build/zlib_pkg
2. 下载 Ubuntu 20.04 的 ARM64 zlib 包(兼容旧版交叉工具链)
bash
wget http://ports.ubuntu.com/ubuntu-ports/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2ubuntu1_arm64.deb
wget http://ports.ubuntu.com/ubuntu-ports/pool/main/z/zlib/zlib1g-dev_1.2.11.dfsg-2ubuntu1_arm64.deb
3. 解压包
bash
dpkg-deb -x zlib1g_1.2.11.dfsg-2ubuntu1_arm64.deb tmp_zlib
dpkg-deb -x zlib1g-dev_1.2.11.dfsg-2ubuntu1_arm64.deb tmp_zlib_dev
4. 复制库文件到交叉编译目录(注意路径是 lib/aarch64-linux-gnu)
bash
sudo cp tmp_zlib/lib/aarch64-linux-gnu/libz.so.1.2.11 /usr/aarch64-linux-gnu/lib/
sudo cp tmp_zlib/lib/aarch64-linux-gnu/libz.so.1 /usr/aarch64-linux-gnu/lib/
5. 创建开发链接 libz.so(指向实际版本)
bash
cd /usr/aarch64-linux-gnu/lib
sudo ln -sf libz.so.1.2.11 libz.so
6. 验证
bash
ls -l /usr/aarch64-linux-gnu/lib/libz.so*
file /usr/aarch64-linux-gnu/lib/libz.so.1.2.11