Ubuntu 22.04 交叉编译 RK3568 MPP + FFmpeg 完整指南

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
相关推荐
为思念酝酿的痛4 小时前
Reactor反应堆模式
linux·服务器·网络
沫璃染墨4 小时前
从零入门计算机网络系列(六):TCP套接字编程实战——从listen监听到客户端与服务器通信
linux·服务器·c++·tcp/ip·计算机网络·tcp
2401_872418784 小时前
把 Ubuntu 服务器变成 AI Agent 终端:用自然语言或语音管理 Linux,任何命令都先审批(附完整 Python 源码)
linux·服务器·ubuntu·agent
coderSong25684 小时前
【Ubuntu】ctrl+shift+f 繁体中文切换、VScode全集搜索
linux·vscode·ubuntu
AR-26710-4 小时前
Linux Day22——复习第三部分
linux·运维
迪康coolmu4 小时前
基于迪康端点安全一体化管理系统的公用终端上机与信创补丁实战
linux·运维·服务器·网络·安全·电脑
blueSatchel4 小时前
imx6ull显示控制器设备驱动解读
linux·嵌入式
水饺编程4 小时前
第2章:Linux 基础,关机命令
linux·c语言·汇编
JiMoKuangXiangQu4 小时前
Linux CFS 负载均衡:从 CPU 拓扑到任务迁移
linux·负载均衡
91刘仁德4 小时前
计算机网络核心协议全解析:从MAC帧到HTTP
linux·网络·网络协议·tcp/ip·计算机网络·http·udp