跳至主内容
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

Rockchip VPU 硬件加速教程

本教程将指导您通过 RKMPP 在 Rockchip VPU 上设置完整的视频硬件加速功能。

警告

RKMPP 硬件加速需要 Jellyfin 10.9 或更高版本。

加速方法

硬件加速转码已在 RK3588/3588S SoC 的 Rockchip VPU 上获得支持和验证。

Linux 是唯一支持的操作系统平台,且 RKMPP 是唯一可用的加速方法。

Jellyfin 中的 RKMPP 包含两个组件:MPP 和 RGA。Jellyfin 利用它们实现零拷贝转码流水线。

通常在基于 ARM 的 SoC 中,VPU 负责视频编解码,而 GPU 仅负责图形和计算任务。例如 RK3588 SoC 上的 Mali-G610 GPU 仅用于基于 OpenCL 的 HDR 色调映射。

MPP 接口是 Rockchip 提供的 SDK 和 BSP 内核的组成部分。其内核驱动和用户态运行时库均为开源实现,不依赖专有固件。Rockchip 曾尝试使用上游 V4L2 接口,但无法满足其产品的实际需求。在 Linux 主线内核提供成熟的转码解决方案前,用户需使用 RKMPP。

RGA 接口是 Rockchip 的 2D 后处理单元,用于视频缩放、像素格式转换、字幕烧录等操作。

备注
  • 与 NVIDIA NVENC 不同,Rockchip VPU 没有并发编码会话数量限制

  • RKMPP 支持 Linux 无头服务器模式,无需连接显示器

色调映射方法

硬件加速的 HDR 转 SDR 色调映射RK3588/3588S SoC 上受支持,受硬件像素格式限制。

OpenCL 是唯一可用的色调映射方法,支持零拷贝。

选择 SoC/VPU 硬件

RK3588/3588S 是目前最推荐的 SoC。除常见编解码器外,它还支持 10-bit H.264 (High10)AV1 解码,H.264/HEVC 编码速度最高可达 1080p@480fps 或 4k@120fps。旧款芯片(如 RK356x 和 RK33xx)可能受支持但未经充分测试,其编码分辨率支持有限且缺乏硬件 HDR 色调映射功能。建议购买新 SBC 时查阅 Rockchip SoC 数据手册。

转码H.264

AVC/H.264 8-bit 因其优异的兼容性仍被广泛使用。所有支持 RKMPP 的 Rockchip SoC 均可编解码该格式。

  • H.264 8-bit 编解码 - 所有支持 RKMPP 的 Rockchip SoC

  • H.264 10-bit 解码 - 几乎所有 RK33xx 及后续 Rockchip SoC

转码HEVC

HEVC/H.265 仍然是存储4K 10-bit、HDR和杜比视界视频的首选格式。得益于x265成熟的软件编码支持,以及2016年后发布的大多数GPU广泛实现的硬件编码支持。

Rockchip 的 HEVC 支持情况较为复杂:

  • HEVC 8位解码 - 几乎所有RK33xx及更新的瑞芯微SoC都支持

  • HEVC 8位编码 - 几乎所有RK35xx及更新的瑞芯微SoC都支持

  • HEVC 10位解码 - 几乎所有RK33xx及更新的瑞芯微SoC都支持

AV1转码支持

AV1是免版税的未来级视频编码格式。其更小的文件尺寸能大幅节省存储空间和网络带宽,但缺点是编解码对CPU要求极高。硬件加速使实时转码AV1流成为可能。Jellyfin 10.9及以上版本支持AV1编码。

瑞芯微在最新SoC中增加了AV1加速支持:

  • AV1 8/10位解码 - Rockchip RK3588/3588S和RK3576 SoC

  • AV1 8/10位编码 - 截至RK3588系列,尚无支持AV1编码器的瑞芯微SoC

其他编解码器支持

请参考以下资源:

速度与画质表现

  • RK3588/3588S支持最高1080p@480fps或4k@120fps转码

  • RK3576的转码能力约为RK3588的一半,但其RGA硬件存在像素格式限制,无法支持色调映射

  • RK356x编码器有1080p@100fps的分辨率限制,无法满足实时4k编码需求

  • RK33xx及更旧型号不推荐使用,其编码器仅支持H.264 1080p@30fps

由于测试设备有限,我们无法比较不同代次瑞芯微SoC的质量差异。通常新一代SoC编码质量更好。初步观察,RK3588系列的VPU能很好满足实时流媒体画质需求。

Linux 环境配置

推荐使用64位Linux发行版,必须使用Rockchip BSP内核(6.1或5.10 LTS版本)

Linux 主机配置指南

Debian/Ubuntu 系统

Jellyfin所需的jellyfin-ffmpeg* deb包已包含所有必要的用户态Rockchip MPP & RGA驱动

此外只需安装OpenCL运行时(libmali)并配置设备权限

备注

需要 root 权限。

  1. 假设您已将jellyfin仓库添加到apt源,并安装了jellyfin-server, jellyfin-webjellyfin-ffmpeg7

  2. 确保/dev目录中存在dma_heap, dri, mpp_servicerga设备节点。否则请将BSP内核升级至5.10 LTS或更新版本

    $ ls -l /dev | grep -E "mpp|rga|dri|dma_heap"
    drwxr-xr-x 2 root root 80 Jan 1 1970 dma_heap
    drwxr-xr-x 3 root root 140 Jan 18 18:50 dri
    crw-rw---- 1 root video 241, 0 Jan 18 18:50 mpp_service
    crw-rw---- 1 root video 10, 122 Jan 18 18:50 rga
  3. 将以下内容添加到 /etc/udev/rules.d/99-rk-device-permissions.rules 文件中,重启系统使配置生效:

    KERNEL=="mpp_service", MODE="0660", GROUP="video"
    KERNEL=="rga", MODE="0660", GROUP="video"
    KERNEL=="system", MODE="0666", GROUP="video"
    KERNEL=="system-dma32", MODE="0666", GROUP="video"
    KERNEL=="system-uncached", MODE="0666", GROUP="video"
    KERNEL=="system-uncached-dma32", MODE="0666", GROUP="video" RUN+="/usr/bin/chmod a+rw /dev/dma_heap"
  4. jellyfin 用户加入 rendervideo 用户组,然后重启 jellyfin 服务:

    备注

    某些 Linux 发行版中,用户组名称可能为 input

    sudo usermod -aG render jellyfin
    sudo usermod -aG video jellyfin
    sudo systemctl restart jellyfin
  5. 在宿主机上安装 ARM Mali OpenCL 运行时 (libmali):

    备注

    此步骤仅在使用 RK3588/3588S 进行 HDR 色调映射前需要。此举可确保用户空间固件与内核驱动版本匹配,否则 OpenCL 无法正常工作。

  6. 检查 OpenCL 运行时状态:

    sudo /usr/lib/jellyfin-ffmpeg/ffmpeg -v debug -init_hw_device rkmpp=rk -init_hw_device opencl=ocl@rk

    arm_release_ver: g24p0-00eac0, rk_so_ver: 8
    [AVHWDeviceContext @ 0xaaaae8321360] 1 OpenCL platforms found.
    [AVHWDeviceContext @ 0xaaaae8321360] 1 OpenCL devices found on platform "ARM Platform".
    [AVHWDeviceContext @ 0xaaaae8321360] 0.0: ARM Platform / Mali-G610 r0p0
    [AVHWDeviceContext @ 0xaaaae8321360] cl_arm_import_memory found as platform extension.
    [AVHWDeviceContext @ 0xaaaae8321360] cl_khr_image2d_from_buffer found as platform extension.
    [AVHWDeviceContext @ 0xaaaae8321360] DRM to OpenCL mapping on ARM function found (clImportMemoryARM).
    ...
  7. 在 Jellyfin 中启用 RKMPP 并取消勾选不支持的编解码器

Linux 虚拟化环境配置

开始前请先完成上文Linux 主机配置中的步骤 2 和 5。此配置同时适用于 Docker 和 LXC 环境

官方 Docker 镜像

官方 Docker 镜像已包含所有必要的用户态 Rockchip MPP、RGA 及 OpenCL 驱动

您只需将 VPU 的设备文件从宿主机传递至 Docker 容器,并启用特权模式

备注

需要 root 权限。

  1. 使用 Docker 命令行:(for...done 循环中的扩展设备名用于确保向后兼容性)

    sudo docker run -d \
    --security-opt systempaths=unconfined \
    --security-opt apparmor=unconfined \
    --name=jellyfin \
    --volume /path/to/config:/config \
    --volume /path/to/cache:/cache \
    --volume /path/to/media:/media \
    --net=host \
    --restart=unless-stopped \
    `for dev in dri dma_heap mali0 rga mpp_service \
    iep mpp-service vpu_service vpu-service \
    hevc_service hevc-service rkvdec rkvenc vepu h265e ; do \
    [ -e "/dev/$dev" ] && echo " --device /dev/$dev"; \
    done` \
    jellyfin/jellyfin
  2. 检查 OpenCL 运行时状态,确保已安装 libmali 的 GPU 固件

    备注

    此步骤仅在 RK3588/3588S 上使用 HDR 色调映射前需要执行

    # Check the OpenCL (GPU firmware) on host with clinfo
    sudo apt update && sudo apt install -y clinfo && clinfo

    # Check the OpenCL runtime of Docker image with jellyfin-ffmpeg
    sudo docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/ffmpeg -v debug -init_hw_device rkmpp=rk -init_hw_device opencl=ocl@rk
  3. 在 Jellyfin 中启用 RKMPP 并取消勾选不支持的编解码器

LXC (Linux 容器)

此配置对将 RK3588/3588S SoC 作为 Proxmox 宿主机的用户可能有用。在 Proxmox 中,LXC 是通过系统容器(LXC)与应用容器(Docker)实现轻量级虚拟化的官方唯一支持方案。截至目前,Proxmox 团队尚不支持 ARM 平台作为宿主机——未来大概率也不会支持——但在 ARM 设备上成功部署 Proxmox 已有先例

LXC 的设置思路与 Docker 类似——需要将 VPU 的设备文件从主机传递到 LXC 并启用特权模式(另请参阅下方关于特权 LXC 容器的重要“说明”)。

  1. 要获取需传递给容器的设备文件列表,请在 Linux 主机上执行以下单行命令:

    for dev in dri dma_heap mali0 rga mpp_service iep mpp-service vpu_service vpu-service hevc_service hevc-service rkvdec rkvenc vepu h265e ; do [ -e "/dev/$dev" ] && echo "device /dev/$dev";  done
    device /dev/dri
    device /dev/dma_heap
    device /dev/mali0
    device /dev/rga
    device /dev/mpp_service

    以下是启用 VPU 硬件加速所需的最小额外容器配置示例(非完整配置):

    lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
    lxc.mount.entry: /dev/dma_heap dev/dma_heap none bind,optional,create=dir
    lxc.mount.entry: /dev/mpp_service dev/mpp_service none bind,optional,create=file
    lxc.mount.entry: /dev/rga dev/rga none bind,optional,create=file
    lxc.mount.entry: /dev/mali0 dev/mali0 none bind,optional,create=file
    lxc.cgroup2.devices.allow: a

    请参考 lxc.container.conf 手册页了解 lxc.mount.entrylxc.cgroup2.devices 选项的用途。 若存在安全顾虑,可将 lxc.cgroup2.devices.allow: a 规则替换为限制性更强的"allowlist device program"(手册页中有示例),显式枚举容器命名空间应访问的主机 VPU 字符设备。

    警告

    特权 LXC 容器在设计上被认为不安全——详见 LXC 官方文档。本指南不涵盖在非特权容器中启用 Jellyfin VPU 硬件加速的步骤。

  2. 在 LXC 容器中安装受支持的 jellyfin 软件包,或可选择在容器内使用官方 Docker 镜像。

  3. 按以下步骤验证 OpenCL 运行时状态 - 示例来自 Ubuntu Jammy 的 LXC 运行时 (步骤与 Docker 部署相同):

    • 必须在 LXC 容器内安装 libmali 用户空间驱动,否则 opencl=ocl@rk 设备将无法初始化
    dpkg -l | egrep "libmali|clinfo|jellyfin"
    ii  clinfo                          3.0.21.02.21-1                          arm64        Query OpenCL system information
    ii jellyfin 10.10.1+ubu2204 all Jellyfin is the Free Software Media System.
    ii jellyfin-ffmpeg7 7.0.2-5-jammy arm64 Tools for transcoding, streaming and playing of multimedia files
    ii jellyfin-server 10.10.1+ubu2204 arm64 Jellyfin is the Free Software Media System.
    ii jellyfin-web 10.10.1+ubu2204 all Jellyfin is the Free Software Media System.
    ii libmali-valhall-g610-g13p0-gbm 1.9-1 arm64 Mali GPU User-Space Binary Drivers
    sudo /usr/lib/jellyfin-ffmpeg/ffmpeg -v debug -init_hw_device rkmpp=rk -init_hw_device opencl=ocl@rk
    < -- snip -- >
    arm_release_ver: g13p0-01eac0, rk_so_ver: 10
    [AVHWDeviceContext @ 0x55a5b30a00] 1 OpenCL platforms found.
    [AVHWDeviceContext @ 0x55a5b30a00] 1 OpenCL devices found on platform "ARM Platform".
    [AVHWDeviceContext @ 0x55a5b30a00] 0.0: ARM Platform / Mali-G610 r0p0
    [AVHWDeviceContext @ 0x55a5b30a00] cl_arm_import_memory found as platform extension.
    [AVHWDeviceContext @ 0x55a5b30a00] cl_khr_image2d_from_buffer found as platform extension.
    [AVHWDeviceContext @ 0x55a5b30a00] DRM to OpenCL mapping on ARM function found (clImportMemoryARM).
    Successfully parsed a group of options.
    < -- snip -- >
  4. 在 Jellyfin 图形界面启用 RKMPP,勾选支持的(且需要的)编解码器,取消勾选不支持的编解码器——详见选择 SoC/VPU 硬件章节。

Linux 系统验证方法

对于 6.1.84 之前版本的 BSP 内核,尚无可靠方法读取 Rockchip SoC 的 VPU 负载/利用率。

但仍可通过读取其他引擎(如 RGA 2D 硬件加速块传输器)间接验证。

备注

需要 root 权限。

  1. 在 Jellyfin Web 客户端播放视频,通过降低分辨率或码率触发视频转码。

  2. VPU 负载/利用率:运行 sudo sh -c "echo 1000 > /proc/mpp_service/load_interval" && sudo watch -n 1 cat /proc/mpp_service/load

    Every 1.0s: cat /proc/mpp_service/load
    fdb51000.avsd-plus load: 0.00% utilization: 0.00%
    fdb50400.vdpu load: 0.00% utilization: 0.00%
    fdb50000.vepu load: 0.00% utilization: 0.00%
    fdb90000.jpegd load: 0.00% utilization: 0.00%
    fdba0000.jpege-core load: 0.00% utilization: 0.00%
    fdba4000.jpege-core load: 0.00% utilization: 0.00%
    fdba8000.jpege-core load: 0.00% utilization: 0.00%
    fdbac000.jpege-core load: 0.00% utilization: 0.00%
    fdbb0000.iep load: 0.00% utilization: 0.00%
    fdbd0000.rkvenc-core load: 98.26% utilization: 97.25%
    fdbe0000.rkvenc-core load: 10.78% utilization: 10.69%
    fdc38100.rkvdec-core load: 17.41% utilization: 17.09%
    fdc48100.rkvdec-core load: 17.64% utilization: 17.30%
    fdc70000.av1d load: 0.00% utilization: 0.00%
  3. RGA 负载:运行 sudo watch -n 1 cat /sys/kernel/debug/rkrga/load

    Every 1.0s: cat /sys/kernel/debug/rkrga/load
    num of scheduler = 3
    ================= load ==================
    scheduler[0]: rga3_core0
    load = 42%
    -----------------------------------
    scheduler[1]: rga3_core1
    load = 27%
    -----------------------------------
    scheduler[2]: rga2
    load = 0%
    -----------------------------------
    process 17: pid = 217002, name: /usr/lib/jellyfin-ffmpeg/ffmpeg ... -init_hw_device rkmpp=rk -hwaccel rkmpp -hwaccel_output_format drm_prime ...