RK3568 交叉编译与部署:MPP + FFmpeg 硬解全流程
1. 引言
在嵌入式开发中,RK3568 凭借较强的视频编解码能力,常被用于 RTSP 拉流、视频转码等场景。要充分发挥其硬件加速能力,通常需要编译 MPP(Media Process Platform)与支持 rkmpp 硬件加速器的 FFmpeg。
本文记录一套从零开始、在 Ubuntu PC 上交叉编译 MPP + FFmpeg 并部署到 RK3568 开发板的完整流程。整个过程使用 aarch64-linux-gnu- 交叉编译工具链,最终产物可直接拷贝到开发板运行。
2. 环境准备
2.1 安装依赖
# 安装依赖
sudo apt update
sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu \
cmake git pkg-config yasm build-essential
2.2 安装 ARM64 内核头文件
MPP 编译过程中需要 dma-buf.h 等内核头文件:
# 安装 ARM64 内核头文件(提供 dma-buf.h)
sudo apt install -y linux-libc-dev-arm64-cross
2.3 创建工作目录
mkdir -p ~/ffmpeg_build
cd ~/ffmpeg_build
后续所有源码、编译产物都放在 ~/ffmpeg_build 目录下,便于集中管理和打包。
3. 克隆源码
本项目采用 jellyfin 优化版 MPP 与 rockchip 定制版 FFmpeg,两者配合能获得更好的硬件解码兼容性:
# 克隆 MPP(jellyfin 优化分支)
git clone -b jellyfin-mpp --depth=1 https://github.com/nyanmisaka/mpp.git rkmpp
# 克隆 FFmpeg(rockchip 分支)
git clone --depth=1 https://github.com/nyanmisaka/ffmpeg-rockchip.git ffmpeg
使用 --depth=1 浅克隆可以显著减少下载时间。
4. 编译 MPP 库
MPP 官方提供了 ARM64 交叉编译脚本,位于 build/linux/aarch64 目录:
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
# 编译(脚本自动使用 aarch64-linux-gnu-)
./make-Makefiles.bash
# 安装到临时目录
make install DESTDIR=~/ffmpeg_build/mpp_install PREFIX=/usr
这里将头文件路径改为绝对路径,是为了绕开交叉编译时头文件搜索路径不一致的问题。DESTDIR 指定安装到 PC 上的临时目录,方便后续打包,而 PREFIX=/usr 则保证编译进 FFmpeg 时的库路径正确。
5. 准备 libdrm 依赖
FFmpeg 启用 --enable-libdrm 后需要 ARM64 版本的 libdrm 库。由于 PC 本机的 libdrm 是 x86_64 架构无法直接使用,需要从 Ubuntu ARM64 仓库手动下载并解压:
cd ~/ffmpeg_build
mkdir -p drm_pkg
cd drm_pkg
# 下载 ARM64 版 libdrm 包
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
# 解压
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
5.1 复制库文件
# 创建目标目录
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/
# 创建 libdrm.so 软链接
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.2 创建 pkg-config 文件
为了让交叉编译的 FFmpeg 能找到 libdrm,需要手动创建 pkg-config 描述文件:
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 文件
MPP 安装后生成的 rockchip_mpp.pc 会记录编译时的绝对路径(通常是 PC 用户名相关的路径),需要将其修正为实际部署路径:
# 修正 rockchip_mpp.pc 中的路径
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
注意:请将
/home/heqingchun替换为你自己的实际用户主目录路径。
7. 编译 FFmpeg
cd ~/ffmpeg_build/ffmpeg
# 设置 pkg-config 搜索路径
export PKG_CONFIG_PATH=~/ffmpeg_build/mpp_install/usr/local/lib/pkgconfig:/usr/aarch64-linux-gnu/lib/pkgconfig:$PKG_CONFIG_PATH
# 配置(禁用 kmsgrab 避免编译问题)
./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 -ldrm" \
--pkg-config=aarch64-linux-gnu-pkg-config
关键参数说明:
| 参数 | 作用 |
|---|---|
--enable-cross-compile |
开启交叉编译模式 |
--cross-prefix=aarch64-linux-gnu- |
指定交叉编译工具链前缀 |
--enable-rkmpp |
启用 Rockchip MPP 硬件加速 |
--enable-libdrm |
启用 libdrm 支持 |
--disable-indev=kmsgrab |
禁用 kmsgrab 避免交叉编译报错 |
--pkg-config=aarch64-linux-gnu-pkg-config |
使用交叉编译对应的 pkg-config |
编译与安装:
# 编译
make -j$(nproc)
# 安装到临时目录
make install DESTDIR=~/ffmpeg_build/ffmpeg_install
8. 打包
编译完成后,将产物打包成 tar 包,方便拷贝到开发板:
cd ~/ffmpeg_build
# 打包 FFmpeg
tar -czf ffmpeg.tar.gz -C ffmpeg_install/usr bin lib include
# 打包 MPP 库
tar -czf mpp.tar.gz -C mpp_install/usr/local lib include
9. 部署到开发板
9.1 传输文件
# 传到开发板(替换 IP 和用户名)
scp ffmpeg.tar.gz mpp.tar.gz user@开发板IP:~
9.2 解压与配置
在开发板上执行:
sudo tar -xzf ~/mpp.tar.gz -C /usr/local
sudo tar -xzf ~/ffmpeg.tar.gz -C /usr/local
sudo ldconfig
9.3 配置 PATH 与权限
# 将 /usr/local/bin 加入 PATH(如需要)
echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
# 普通用户访问 MPP 设备
sudo usermod -a -G video $USER
# 重新登录生效,或临时:sudo chmod 666 /dev/mpp_service
将用户加入 video 用户组后需要重新登录才能生效;如果只是临时测试,可以直接修改设备权限。
10. 验证
10.1 检查硬件加速器
# 检查 rkmpp 是否可用
ffmpeg -hwaccels | grep rkmpp
输出中出现 rkmpp 即表示硬件加速器已成功启用。
10.2 本地文件硬解测试
# 硬解测试(本地视频)
ffmpeg -hwaccel rkmpp -i test.mp4 -f null - 2>&1 | tail -10
10.3 RTSP 流硬解测试
# RTSP 流硬解
ffmpeg -hwaccel rkmpp -i rtsp://地址 -f null -
如果命令能正常执行且日志中出现 rkmpp 相关信息,说明 MPP 硬件解码链路已经打通。
11. 目录结构说明
| 目录 | 内容 |
|---|---|
~/ffmpeg_build/rkmpp/ |
MPP 源码 |
~/ffmpeg_build/ffmpeg/ |
FFmpeg 源码 |
~/ffmpeg_build/mpp_install/ |
MPP 编译产物(PC 临时目录) |
~/ffmpeg_build/ffmpeg_install/ |
FFmpeg 编译产物(PC 临时目录) |
开发板 /usr/local/ |
最终部署位置 |
12. 注意事项
-
工具链前缀:交叉编译工具链前缀必须为
aarch64-linux-gnu-,编译脚本默认使用该前缀,请确保已正确安装。 -
libdrm 版本:如果
wget下载 libdrm 返回 404,请到http://ports.ubuntu.com/ubuntu-ports/pool/main/libd/libdrm/查看最新版本号,替换文件名后重新下载。 -
旧版 FFmpeg 冲突:如果开发板已有旧版 ffmpeg,建议安装到
/usr/local避免与系统自带的版本冲突,并通过配置 PATH 优先使用新版本。 -
路径修正:第 6 步修正
rockchip_mpp.pc时,务必根据自己 PC 的实际用户名替换/home/heqingchun,否则 FFmpeg 编译时可能找不到 MPP 库。 -
权限问题:部署后若普通用户无法访问
/dev/mpp_service,需要将用户加入video组并重新登录,或临时用chmod 666开放权限(重启后失效)。
13. 总结
本文完整梳理了从 Ubuntu PC 交叉编译 MPP + FFmpeg 到 RK3568 部署验证的全过程。核心要点可以归纳为:
- 使用
aarch64-linux-gnu-工具链进行交叉编译; - 通过
DESTDIR将编译产物安装到临时目录便于打包; - 手动准备 ARM64 版 libdrm 及其 pkg-config 文件;
- 修正 MPP 的 pkg-config 路径确保 FFmpeg 能正确链接;
- 部署到开发板
/usr/local并配置用户权限。
按照以上流程操作,即可在 RK3568 上获得可用的 rkmpp 硬件加速 FFmpeg,为后续视频处理、RTSP 拉流等场景打下基础。
更多推荐


所有评论(0)