RK3568 交叉编译与部署:MPP + FFmpeg 硬解全流程

📅 发布时间:2026/9/2 16:16:40
RK3568 交叉编译与部署:MPP + FFmpeg 硬解全流程 1. 引言在嵌入式开发中RK3568 凭借较强的视频编解码能力常被用于 RTSP 拉流、视频转码等场景。要充分发挥其硬件加速能力通常需要编译 MPPMedia Process Platform与支持rkmpp硬件加速器的 FFmpeg。本文记录一套从零开始、在 Ubuntu PC 上交叉编译 MPP FFmpeg 并部署到 RK3568 开发板的完整流程。整个过程使用aarch64-linux-gnu-交叉编译工具链最终产物可直接拷贝到开发板运行。2. 环境准备2.1 安装依赖sudoaptupdatesudoaptinstall-y\cmake\git\pkg-config\yasm\build-essential注需要准备交叉编译工具链可参考链接: 『heqingchun-ubuntu系统下交叉编译工具链配置』2.2 安装 ARM64 内核头文件MPP 编译过程中需要dma-buf.h等内核头文件sudoaptinstall-ylinux-libc-dev-arm64-cross2.3 创建工作目录mkdir-p~/ffmpeg_buildcd~/ffmpeg_build后续所有源码、编译产物都放在~/ffmpeg_build目录下便于集中管理和打包。3. 克隆源码本项目采用 jellyfin 优化版 MPP 与 rockchip 定制版 FFmpeg两者配合能获得更好的硬件解码兼容性gitclone-bjellyfin-mpp--depth1https://github.com/nyanmisaka/mpp.git rkmppgitclone--depth1https://github.com/nyanmisaka/ffmpeg-rockchip.git ffmpeg使用--depth1浅克隆可以显著减少下载时间。4. 编译 MPP 库MPP 官方提供了 ARM64 交叉编译脚本位于build/linux/aarch64目录cd~/ffmpeg_build/rkmpp/build/linux/aarch64修改 mpp_dmabuf.c 使用绝对路径绕过头文件搜索问题sed-is|#include linux/dma-buf.h|#include /usr/aarch64-linux-gnu/include/linux/dma-buf.h|~/ffmpeg_build/rkmpp/osal/mpp_dmabuf.c清理缓存首次编译可跳过rm-rfCMakeCache.txt CMakeFiles编译脚本自动使用 aarch64-linux-gnu-./make-Makefiles.bash安装到临时目录makeinstallDESTDIR~/ffmpeg_build/mpp_installPREFIX/usr这里将头文件路径改为绝对路径是为了绕开交叉编译时头文件搜索路径不一致的问题。DESTDIR指定安装到 PC 上的临时目录方便后续打包而PREFIX/usr则保证编译进 FFmpeg 时的库路径正确。5. 准备 libdrm 依赖FFmpeg 启用--enable-libdrm后需要 ARM64 版本的 libdrm 库。由于 PC 本机的 libdrm 是 x86_64 架构无法直接使用需要从 Ubuntu ARM64 仓库手动下载并解压cd~/ffmpeg_buildmkdir-pdrm_pkgcddrm_pkg下载 ARM64 版 libdrm 包wgethttp://ports.ubuntu.com/ubuntu-ports/pool/main/libd/libdrm/libdrm2_2.4.107-8ubuntu1~20.04.2_arm64.debwgethttp://ports.ubuntu.com/ubuntu-ports/pool/main/libd/libdrm/libdrm-dev_2.4.107-8ubuntu1~20.04.2_arm64.deb解压dpkg-deb-xlibdrm2_2.4.107-8ubuntu1~20.04.2_arm64.deb tmp_drm2dpkg-deb-xlibdrm-dev_2.4.107-8ubuntu1~20.04.2_arm64.deb tmp_drm_dev5.1 复制库文件sudomkdir-p/usr/aarch64-linux-gnu/libsudomkdir-p/usr/aarch64-linux-gnu/include/drm复制库文件sudocptmp_drm2/usr/lib/aarch64-linux-gnu/libdrm.so.2.4.0 /usr/aarch64-linux-gnu/lib/sudocptmp_drm2/usr/lib/aarch64-linux-gnu/libdrm.so.2 /usr/aarch64-linux-gnu/lib/创建 libdrm.so 软链接cd/usr/aarch64-linux-gnu/libsudoln-sflibdrm.so.2.4.0 libdrm.so复制头文件cd~/ffmpeg_build/drm_pkgsudocptmp_drm_dev/usr/include/libdrm/*.h /usr/aarch64-linux-gnu/include/drm/5.2 创建 pkg-config 文件为了让交叉编译的 FFmpeg 能找到 libdrm需要手动创建 pkg-config 描述文件sudotee/usr/aarch64-linux-gnu/lib/pkgconfig/libdrm.pcEOF 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 EOF6. 修正 MPP 的 pkg-config 文件MPP 安装后生成的rockchip_mpp.pc会记录编译时的绝对路径通常是 PC 用户名相关的路径需要将其修正为实际部署路径sed-is|^prefix.*|prefix/home/heqingchun/ffmpeg_build/mpp_install/usr/local|~/ffmpeg_build/mpp_install/usr/local/lib/pkgconfig/rockchip_mpp.pcsed-is|^libdir.*|libdir${prefix}/lib|~/ffmpeg_build/mpp_install/usr/local/lib/pkgconfig/rockchip_mpp.pcsed-is|^includedir.*|includedir${prefix}/include|~/ffmpeg_build/mpp_install/usr/local/lib/pkgconfig/rockchip_mpp.pc注意请将/home/heqingchun替换为你自己的实际用户主目录路径。7. 编译 FFmpegcd~/ffmpeg_build/ffmpeg设置 pkg-config 搜索路径exportPKG_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\--archaarch64\--target-oslinux\--cross-prefixaarch64-linux-gnu-\--enable-gpl\--enable-version3\--enable-rkmpp\--enable-libdrm\--disable-indevkmsgrab\--enable-shared\--disable-static\--extra-cflags-I/usr/aarch64-linux-gnu/include\--extra-ldflags-L/usr/aarch64-linux-gnu/lib -ldrm\--pkg-configaarch64-linux-gnu-pkg-config关键参数说明参数作用--enable-cross-compile开启交叉编译模式--cross-prefixaarch64-linux-gnu-指定交叉编译工具链前缀--enable-rkmpp启用 Rockchip MPP 硬件加速--enable-libdrm启用 libdrm 支持--disable-indevkmsgrab禁用 kmsgrab 避免交叉编译报错--pkg-configaarch64-linux-gnu-pkg-config使用交叉编译对应的 pkg-config编译与安装# 编译make-j$(nproc)# 安装到临时目录makeinstallDESTDIR~/ffmpeg_build/ffmpeg_install8. 打包编译完成后将产物打包成 tar 包方便拷贝到开发板cd~/ffmpeg_build# 打包 FFmpegtar-czfffmpeg.tar.gz-Cffmpeg_install/usr bin lib include# 打包 MPP 库tar-czfmpp.tar.gz-Cmpp_install/usr/local lib include9. 部署到开发板9.1 传输文件# 传到开发板替换 IP 和用户名scpffmpeg.tar.gz mpp.tar.gz user开发板IP:~9.2 解压与配置在开发板上执行sudotar-xzf~/mpp.tar.gz-C/usr/localsudotar-xzf~/ffmpeg.tar.gz-C/usr/localsudoldconfig9.3 配置 PATH 与权限# 将 /usr/local/bin 加入 PATH如需要echoexport PATH/usr/local/bin:$PATH~/.bashrcsource~/.bashrc# 普通用户访问 MPP 设备sudousermod-a-Gvideo$USER# 重新登录生效或临时sudo chmod 666 /dev/mpp_service将用户加入video用户组后需要重新登录才能生效如果只是临时测试可以直接修改设备权限。10. 验证10.1 检查硬件加速器# 检查 rkmpp 是否可用ffmpeg-hwaccels|greprkmpp输出中出现rkmpp即表示硬件加速器已成功启用。10.2 本地文件硬解测试# 硬解测试本地视频ffmpeg-hwaccelrkmpp-itest.mp4-fnull -21|tail-1010.3 RTSP 流硬解测试# RTSP 流硬解ffmpeg-hwaccelrkmpp-irtsp://地址-fnull -如果命令能正常执行且日志中出现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 拉流等场景打下基础。