RK3568-Buildroot编译MPP硬件加速ffmpeg-CSDN博客

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
SoCRK3568J(工业级)
CPU4×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(已预装)
目标 ffmpeg8.1(支持 rkmpp)

2.4 版本依赖关系

ffmpeg rkmpp 支持对 MPP 版本有严格要求:

ffmpeg 版本MPP 最低版本说明
4.x1.3.7基础支持
5.x1.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 系统环境精简,缺少完整的编译工具链,因此采用以下方案:

  1. 在 RK3568 Ubuntu22 系统上进行本地编译
  2. 编译时链接 MPP 1.3.9+ 开发库
  3. 将编译好的 ffmpeg 部署到 Buildroot 系统
  4. 运行时使用 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
-gGOP 大小30-60(帧率 × 1-2秒)
-bfB 帧数量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%
内存占用512MB506MB基本持平
系统负载3.50.28降低 92%
CPU 温度72°C46°C降低 26°C
推流延时10s+10s+基本一致

6.3 测试结论

  1. CPU 占用大幅降低:从 261% 降至 4.6%,降幅达 98%
  2. 系统负载显著改善:Load Average 从 3.5 降至 0.28
  3. 发热明显减少:CPU 温度降低 26°C
  4. 延时基本一致:硬件编码延时略有增加,但整体延时主要受网络和缓冲影响

七、问题排查

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 开发板
GitHubLJJ931026
公众号:ALONE_WORK

本文为原创文章,转载请注明出处。如有问题欢迎在评论区留言讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ALONE_WORK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值