RK3568 编译支持 MPP 硬件加速的 ffmpeg 完整指南
前言
在嵌入式视频处理领域,硬件加速编解码是提升系统性能的关键技术。RK3568 作为瑞芯微面向工业和消费电子市场的中高端 SoC,内置了强大的视频处理单元(VPU),支持 H.264/H.265 硬件编解码,理论编解码能力可达 4K@60fps。
然而,许多开发板厂商提供的 Buildroot 系统中,虽然自带了 MPP 库,但 ffmpeg 未编译启用硬件加速支持。本文将以飞凌 RK3568 开发板为例,详细介绍如何在 RK3568 Ubuntu22 系统上编译支持 MPP 硬件加速的 ffmpeg,并部署到 Buildroot Linux5.10 系统上运行。
一、技术背景
1.1 RK3568 VPU 架构
RK3568 的视频处理单元采用瑞芯微自研的 VPU 架构,主要特性如下:
| 特性 | 规格 |
|---|---|
| 编码格式 | H.264、H.265/HEVC |
| 解码格式 | H.264、H.265、VP9、AVS2 |
| 编码能力 | 4K@60fps(H.265)、1080P@120fps |
| 解码能力 | 4K@60fps(H.265)、8K@30fps |
1.2 MPP 软件架构
MPP(Media Process Platform)是瑞芯微提供的多媒体处理中间件,软件架构如下:
┌─────────────────────────────────────┐
│ Application │
│ (ffmpeg/GStreamer) │
├─────────────────────────────────────┤
│ MPP API │
│ (mpi_enc/mpi_dec/mpi_pp) │
├─────────────────────────────────────┤
│ MPP Core │
│ (buffer/packet/codec) │
├─────────────────────────────────────┤
│ VPU Driver (kernel) │
├─────────────────────────────────────┤
│ VPU Hardware │
└─────────────────────────────────────┘
1.3 软硬件编解码对比
| 对比项 | 软件编解码 | 硬件编解码 | 差异分析 |
|---|---|---|---|
| CPU 占用 | 80-100% | 5-15% | 硬件编解码由 VPU 完成 |
| 内存带宽 | 高 | 低 | 硬件编解码使用专用 DMA |
| 功耗 | 高(约 5W) | 低(约 1W) | VPU 能效比更高 |
| 发热 | 明显(70°C+) | 轻微(45°C) | 影响系统稳定性 |
| 编码质量 | 可调 | 固定 | 软编码质量更可控 |
| 延时 | 低 | 略高 | 硬件编解码有固定流水线延时 |
二、环境信息
2.1 硬件环境
| 项目 | 规格 |
|---|---|
| 开发板 | 飞凌 OK3568-C |
| SoC | RK3568J(工业级) |
| CPU | 4×Cortex-A55 @ 2.0GHz |
| 内存 | 2GB/4GB DDR4 |
| 存储 | 16GB eMMC / SD卡 |
2.2 编译环境
| 项目 | 版本 |
|---|---|
| 编译平台 | RK3568 开发板(本地编译) |
| 编译系统 | Ubuntu 22.04 |
| 内核版本 | Linux 5.10.166 |
| GCC 版本 | 11.3.0 |
2.3 部署目标
| 项目 | 版本 |
|---|---|
| 目标系统 | Buildroot Linux 5.10.166 |
| 系统 MPP 版本 | 1.3.8(已预装) |
| 目标 ffmpeg | 8.1(支持 rkmpp) |
2.4 版本依赖关系
ffmpeg rkmpp 支持对 MPP 版本有严格要求:
| ffmpeg 版本 | MPP 最低版本 | 说明 |
|---|---|---|
| 4.x | 1.3.7 | 基础支持 |
| 5.x | 1.3.9 | 推荐,支持更多特性 |
| 6.x+ | 1.3.9+ | 最新版本 |
关键点:Buildroot 系统已预装 MPP 1.3.8,不满足 ffmpeg 5.x+ 的最低要求。因此需要在编译环境安装 MPP 1.3.9+ 用于编译 ffmpeg,但部署时使用目标系统自带的 MPP 库。
三、问题分析
3.1 问题现象
使用 Buildroot 系统自带的 ffmpeg 推流时:
# 检查编码器支持
ffmpeg -encoders 2>/dev/null | grep -E "rkmpp"
# 输出结果(无 rkmpp):
# 无输出,说明不支持硬件编码
尝试指定 rkmpp 编码器时:
ffmpeg -c:v h264_rkmpp -i input.mp4 -f flv rtmp://server/live/stream
# 报错:
# Unknown encoder 'h264_rkmpp'
3.2 根因分析
# 检查系统 MPP 版本
cat /usr/lib/libmpp.so.1 2>/dev/null || ls -la /usr/lib/libmpp*
# 检查 ffmpeg 编译配置
ffmpeg -buildconf 2>/dev/null | grep rkmpp
# 输出为空,说明编译时未启用 rkmpp
结论:Buildroot 系统自带的 ffmpeg 编译时未启用 rkmpp 硬件加速支持,需要重新编译。
3.3 解决方案
由于 Buildroot 系统环境精简,缺少完整的编译工具链,因此采用以下方案:
- 在 RK3568 Ubuntu22 系统上进行本地编译
- 编译时链接 MPP 1.3.9+ 开发库
- 将编译好的 ffmpeg 部署到 Buildroot 系统
- 运行时使用 Buildroot 系统自带的 MPP 库
四、编译步骤
4.1 准备编译环境
4.1.1 安装编译工具
在 RK3568 Ubuntu22 系统上执行:
# 更新软件源
sudo apt update
# 安装编译工具和依赖
sudo apt install -y build-essential git cmake pkg-config \
autoconf automake libtool wget curl \
yasm nasm libx264-dev libx265-dev libfdk-aac-dev \
libdrm-dev libssl-dev libasound2-dev
# 创建工作目录
mkdir -p ~/ffmpeg_build && cd ~/ffmpeg_build
export WORK_DIR=$(pwd)
4.1.2 设置环境变量
# 设置安装路径
export PREFIX=/opt/rk3568_ffmpeg
export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig:$PKG_CONFIG_PATH
4.2 编译 MPP 开发库
由于 Ubuntu22 系统没有 MPP 库,需要先编译安装 MPP 开发库(仅用于编译 ffmpeg):
cd ${WORK_DIR}
# 克隆 MPP 源码(最新版本)
git clone https://github.com/rockchip-linux/mpp.git
cd mpp
# 查看当前版本
git log -1 --format="%h %s"
# 创建构建目录
mkdir -p build && cd build
# 配置编译选项
cmake .. \
-DCMAKE_INSTALL_PREFIX=${PREFIX} \
-DCMAKE_BUILD_TYPE=Release \
-DENABLE_TESTS=OFF
# 编译安装
make -j$(nproc)
sudo make install
# 验证安装
ls -la ${PREFIX}/lib/libmpp*
pkg-config --modversion mpp
# 输出:1.3.9
4.3 编译 ffmpeg
4.3.1 获取源码
cd ${WORK_DIR}
# 克隆 ffmpeg 源码(最新版本)
git clone https://github.com/FFmpeg/FFmpeg.git ffmpeg
cd ffmpeg
# 查看版本
git log -1 --format="%h %s"
# 当前版本:8.1
4.3.2 配置编译选项
# 配置 ffmpeg(启用 rkmpp 硬件加速)
./configure \
--prefix=${PREFIX} \
--enable-gpl \
--enable-nonfree \
--enable-version3 \
--enable-static \
--disable-shared \
--enable-libx264 \
--enable-libx265 \
--enable-libfdk-aac \
--enable-rkmpp \
--enable-libdrm \
--extra-cflags="-I${PREFIX}/include" \
--extra-ldflags="-L${PREFIX}/lib" \
--extra-libs="-lpthread -lm -lrt"
关键参数说明:
| 参数 | 说明 |
|---|---|
--enable-rkmpp | 启用 Rockchip MPP 硬件编解码 |
--enable-libdrm | 启用 DRM 支持(MPP 依赖) |
--enable-static | 静态链接,便于部署 |
--disable-shared | 不生成动态库 |
4.3.3 编译安装
# 编译(使用多核加速,RK3568 4核约需 30-60 分钟)
make -j$(nproc)
# 安装到目标目录
sudo make install
# 验证编译结果
${PREFIX}/bin/ffmpeg -version
${PREFIX}/bin/ffmpeg -encoders | grep rkmpp
预期输出:
ffmpeg version 8.1 Copyright (c) 2000-2024 the FFmpeg developers
V..... h264_rkmpp Rockchip MPP (Media Process Platform) H.264 encoder (codec h264)
V..... hevc_rkmpp Rockchip MPP (Media Process Platform) HEVC encoder (codec hevc)
4.4 部署到 Buildroot 系统
4.4.1 打包 ffmpeg
cd ${PREFIX}/bin
# 仅打包 ffmpeg 和 ffprobe 可执行文件
tar -czvf ffmpeg_rkmpp.tar.gz ffmpeg ffprobe
# 查看文件大小
ls -lh ffmpeg_rkmpp.tar.gz
4.4.2 传输到 Buildroot 系统
# 方式1:通过 SD 卡
# 将 ffmpeg_rkmpp.tar.gz 复制到 SD 卡,然后在 Buildroot 系统中挂载读取
# 方式2:通过网络传输(如果 Buildroot 系统有网络)
scp ffmpeg_rkmpp.tar.gz root@192.168.1.100:/tmp/
4.4.3 在 Buildroot 系统上安装
# 在 Buildroot 系统上执行
cd /tmp
# 解压
tar -xzvf ffmpeg_rkmpp.tar.gz
# 移动到系统目录
mv ffmpeg ffprobe /usr/local/bin/
# 添加执行权限
chmod +x /usr/local/bin/ffmpeg /usr/local/bin/ffprobe
# 验证安装
ffmpeg -version
ffmpeg -encoders | grep rkmpp
4.4.4 验证 MPP 库兼容性
# 检查 Buildroot 系统的 MPP 库
ls -la /usr/lib/libmpp*
# 检查 ffmpeg 链接的库
ldd /usr/local/bin/ffmpeg | grep mpp
# 预期输出:
# libmpp.so.1 => /usr/lib/libmpp.so.1 (0x...)
说明:ffmpeg 静态编译时已将 rkmpp 相关代码编译进二进制文件,运行时动态链接系统 MPP 库。Buildroot 系统自带的 MPP 1.3.8 可以正常工作。
五、使用指南
5.1 基础使用
5.1.1 硬件编码推流
# USB 摄像头采集 + H.264 硬件编码 + RTMP 推流
ffmpeg -f v4l2 -video_size 1920x1080 -framerate 30 \
-i /dev/video9 \
-c:v h264_rkmpp -b:v 2M \
-c:a aac -b:a 128k \
-f flv rtmp://server/live/stream
# H.265 硬件编码(更高压缩率)
ffmpeg -f v4l2 -i /dev/video9 \
-c:v hevc_rkmpp -b:v 1.5M \
-f flv rtmp://server/live/stream
5.1.2 硬件解码
# 硬件解码 RTSP 流并保存
ffmpeg -c:v h264_rkmpp \
-i rtsp://camera_ip/stream \
-c:v libx264 -b:v 2M \
-f mp4 output.mp4
# 硬件解码 + 硬件编码(转码)
ffmpeg -c:v h264_rkmpp -i input.mp4 \
-c:v hevc_rkmpp -b:v 1M \
-c:a copy output_hevc.mp4
5.2 编码参数
5.2.1 质量参数
# 高质量编码
ffmpeg -i input.mp4 \
-c:v h264_rkmpp \
-b:v 4M \
-rc_mode cbr \
-profile high \
-level 4.1 \
output.mp4
# 低延时编码(适用于实时通信)
ffmpeg -i input.mp4 \
-c:v h264_rkmpp \
-b:v 2M \
-rc_mode vbr \
-g 30 \
-bf 0 \
output.mp4
5.2.2 参数说明
| 参数 | 说明 | 推荐值 |
|---|---|---|
-b:v | 视频码率 | 1M-4M(根据分辨率调整) |
-rc_mode | 码率控制模式 | cbr(恒定码率)/ vbr(可变码率) |
-profile | 编码规格 | baseline / main / high |
-level | 编码级别 | 3.1 / 4.0 / 4.1 |
-g | GOP 大小 | 30-60(帧率 × 1-2秒) |
-bf | B 帧数量 | 0-2 |
六、性能测试
6.1 测试环境
| 项目 | 配置 |
|---|---|
| 测试平台 | 飞凌 RK3568 Buildroot Linux 5.10.166 |
| 测试视频 | 1080P@30fps,USB 摄像头采集 |
| 测试场景 | RTMP 推流 |
| 测试时长 | 10 分钟 |
6.2 测试结果
| 指标 | 软件编码(libx264) | 硬件编码(h264_rkmpp) | 提升幅度 |
|---|---|---|---|
| CPU 占用 | 261%(接近 3 核满载) | 4.6% | 降低 98% |
| 内存占用 | 512MB | 506MB | 基本持平 |
| 系统负载 | 3.5 | 0.28 | 降低 92% |
| CPU 温度 | 72°C | 46°C | 降低 26°C |
| 推流延时 | 10s+ | 10s+ | 基本一致 |
6.3 测试结论
- CPU 占用大幅降低:从 261% 降至 4.6%,降幅达 98%
- 系统负载显著改善:Load Average 从 3.5 降至 0.28
- 发热明显减少:CPU 温度降低 26°C
- 延时基本一致:硬件编码延时略有增加,但整体延时主要受网络和缓冲影响
七、问题排查
7.1 编译问题
问题 1:找不到 rkmpp 编码器
# 症状
ffmpeg -encoders | grep rkmpp
# 无输出
# 排查步骤
# 1. 检查 MPP 库是否安装
ls -la ${PREFIX}/lib/libmpp*
# 2. 检查 pkg-config
pkg-config --libs mpp
# 3. 更新库缓存
sudo ldconfig
# 4. 重新编译 ffmpeg
make clean && ./configure --enable-rkmpp ... && make -j$(nproc)
问题 2:编译时报错 “mpp not found”
# 症状
ERROR: rkmpp not found
# 解决方案
# 设置 PKG_CONFIG_PATH
export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig:$PKG_CONFIG_PATH
# 或指定 MPP 路径
./configure --extra-cflags="-I${PREFIX}/include" \
--extra-ldflags="-L${PREFIX}/lib" \
--enable-rkmpp
7.2 运行问题
问题 3:运行时报错 “failed to open mpp device”
# 症状
[error] mpp: failed to open mpp device
# 排查步骤
# 1. 检查设备节点
ls -la /dev/mpp* /dev/vpu-service /dev/rkvdec /dev/rkvenc
# 2. 检查内核模块
lsmod | grep mpp
lsmod | grep vpu
# 3. 检查权限
sudo chmod 666 /dev/mpp*
sudo usermod -aG video $USER
问题 4:编码画面花屏或绿屏
# 症状
# 输出视频画面异常
# 原因分析
# 输入格式与编码器不兼容
# 解决方案
# 指定像素格式
ffmpeg -i input.mp4 \
-pix_fmt nv12 \
-c:v h264_rkmpp \
output.mp4
八、总结
本文详细介绍了在 RK3568 Ubuntu22 系统上编译支持 MPP 硬件加速的 ffmpeg,并部署到 Buildroot Linux 5.10 系统的完整流程:
编译方案:
- 在 RK3568 Ubuntu22 系统上进行本地编译
- 编译环境安装 MPP 1.3.9 开发库
- ffmpeg 版本 8.1,启用 rkmpp 支持
- 静态编译,便于部署
部署方案:
- Buildroot 系统已预装 MPP 1.3.8
- 仅需部署 ffmpeg 可执行文件
- 运行时动态链接系统 MPP 库
性能收益:
- CPU 占用从 261% 降至 4.6%,降低 98%
- 系统负载降低 92%
- CPU 温度降低 26°C
最佳实践:
- 开发阶段:在 Ubuntu 系统上编译验证
- 部署阶段:将编译好的 ffmpeg 部署到 Buildroot 系统
- 利用系统自带 MPP 库,无需额外编译
硬件加速是嵌入式视频应用的核心优化手段,正确配置后可大幅提升系统性能和稳定性,为业务逻辑留出充足的 CPU 算力空间。
作者:李江军
日期:2026-04-08
平台:飞凌 RK3568 开发板
GitHub:LJJ931026
公众号:ALONE_WORK
本文为原创文章,转载请注明出处。如有问题欢迎在评论区留言讨论。
1万+

被折叠的 条评论
为什么被折叠?



