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. 注意事项

  1. 工具链前缀:交叉编译工具链前缀必须为 aarch64-linux-gnu-,编译脚本默认使用该前缀,请确保已正确安装。

  2. libdrm 版本:如果 wget 下载 libdrm 返回 404,请到 http://ports.ubuntu.com/ubuntu-ports/pool/main/libd/libdrm/ 查看最新版本号,替换文件名后重新下载。

  3. 旧版 FFmpeg 冲突:如果开发板已有旧版 ffmpeg,建议安装到 /usr/local 避免与系统自带的版本冲突,并通过配置 PATH 优先使用新版本。

  4. 路径修正:第 6 步修正 rockchip_mpp.pc 时,务必根据自己 PC 的实际用户名替换 /home/heqingchun,否则 FFmpeg 编译时可能找不到 MPP 库。

  5. 权限问题:部署后若普通用户无法访问 /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 拉流等场景打下基础。

Logo

一站式 AI 云服务平台

更多推荐