Ir al contenido principal
Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Tutorial de Aceleración por Hardware en VPU Rockchip

Este tutorial te guía para configurar la aceleración por hardware completa de video en VPU Rockchip mediante RKMPP.

advertencia

La aceleración por hardware RKMPP requiere Jellyfin 10.9 o superior.

Métodos de aceleración

La transcodificación acelerada por hardware está soportada y verificada con la VPU Rockchip de los SoC RK3588/3588S.

Linux es la única plataforma soportada y RKMPP es el único método disponible.

RKMPP en Jellyfin incluye dos componentes: MPP y RGA. Jellyfin los utiliza para lograr un pipeline de transcodificación zero-copy.

Normalmente en SoCs basados en ARM, la VPU se encarga de decodificar y codificar video, mientras que la GPU solo se encarga de gráficos y computación. Por ejemplo, la GPU Mali-G610 en el SoC RK3588 solo se utiliza para el mapeo de tonos HDR basado en OpenCL.

La interfaz MPP forma parte del SDK y kernel BSP proporcionado por Rockchip. Su controlador de kernel y biblioteca de tiempo de ejecución en modo usuario son implementaciones de código abierto y no dependen de firmware propietario. Rockchip ha experimentado con la interfaz V4L2 upstream, pero no satisface las necesidades reales de Rockchip en sus productos. Hasta que exista una solución de transcodificación madura en el mainline de Linux, los usuarios necesitan utilizar RKMPP.

La interfaz RGA es la unidad de postprocesamiento 2D de Rockchip, utilizada para escalado de video, conversión de formato de píxeles, incrustación de subtítulos, etc.

nota
  • A diferencia de NVIDIA NVENC, no hay límite de sesiones de codificación simultáneas en la VPU Rockchip.

  • RKMPP soporta servidores headless en Linux, lo que significa que no se requiere un monitor conectado.

Métodos de mapeo de tono

El mapeo de tonos acelerado por hardware de HDR a SDR solo está soportado en SoC RK3588/3588S debido a limitaciones de formato de píxel en el hardware.

OpenCL es el único método disponible para mapeo de tonos. Soporta zero-copy.

Selección de Hardware SoC/VPU

RK3588/3588S es actualmente el SoC más recomendado. Además de los códecs comunes, también soporta decodificación H.264 de 10 bits (High10) y AV1, y tiene una velocidad de codificación H.264/HEVC de hasta 1080p@480fps o 4k@120fps. Chips más antiguos podrían ser compatibles pero no hemos podido probarlos, como RK356x y RK33xx. Tienen soporte de resolución de codificación bastante limitado, además de carecer de soporte para mapeo de tonos HDR por hardware. Es mejor consultar la hoja de datos del SoC Rockchip antes de comprar una nueva SBC para aceleración por hardware.

Transcodificar H.264

AVC / H.264 de 8 bits sigue siendo ampliamente utilizado debido a su excelente compatibilidad. Todos los SoC Rockchip que soportan RKMPP pueden decodificarlo y codificarlo.

  • Decodificación y codificación H.264 de 8 bits - Cualquier SoC Rockchip que soporte RKMPP.

  • Decodificación H.264 de 10 bits - Casi todos los SoC Rockchip desde RK33xx en adelante.

Transcodificar HEVC

HEVC / H.265 sigue siendo la primera opción para almacenar video en 4K a 10 bits, HDR y Dolby Vision. Cuenta con soporte de codificación por software maduro gracias a x265, además de amplia implementación de codificación por hardware en la mayoría de GPUs lanzadas después de 2016.

El soporte HEVC en Rockchip es complejo:

  • Decodificación HEVC de 8 bits - Casi todos los SoC Rockchip desde RK33xx en adelante.

  • Codificación HEVC de 8 bits - Casi todos los SoC Rockchip desde RK35xx en adelante.

  • Decodificación HEVC de 10 bits - Casi todos los SoC Rockchip desde RK33xx en adelante.

Transcodificación AV1

AV1 es un códec de video libre de regalías y preparado para el futuro. Ahorra mucho espacio de almacenamiento y ancho de banda de red gracias a su menor tamaño de archivo. La desventaja es que la decodificación y codificación son muy demandantes para la CPU. La aceleración por hardware hace posible transcodificar flujos AV1 al vuelo. El soporte para codificación AV1 está disponible en Jellyfin 10.9 y versiones posteriores.

Rockchip añadió soporte para aceleración AV1 en sus últimos SoC:

  • Decodificación de AV1 8/10 bits - SoC Rockchip RK3588/3588S y RK3576.

  • Codificación de AV1 8/10 bits - Hasta la serie RK3588, no hay ningún SoC de Rockchip que soporte codificador AV1.

Transcodificar otros códecs

Consulte estos enlaces:

Velocidad y calidad

  • RK3588/3588S soporta transcodificación de hasta 1080p@480fps o 4k@120fps.

  • RK3576 tiene aproximadamente la mitad de capacidad de transcodificación que RK3588. Sin embargo, debido a limitaciones de formato de píxel en su hardware RGA, carece de capacidades de mapeo de tonos.

  • RK356x tiene límite de resolución en el codificador (1080p@100fps). No satisface necesidades de codificación 4K en tiempo real.

  • No se recomiendan RK33xx y anteriores: sus codificadores solo soportan H.264 a 1080p@30fps.

Debido a la falta de dispositivos de prueba, no podemos comparar diferencias de calidad entre generaciones de SoC Rockchip. Generalmente, cuanto más nuevo el SoC, mejor la calidad de codificación. A primera vista, la VPU de la serie RK3588 satisface muy bien los requisitos de calidad para streaming en tiempo real.

Configuraciones para Linux

Se recomienda una distribución Linux de 64 bits. Se requiere el kernel BSP de Rockchip (6.1 o 5.10 LTS).

Configurar en host Linux

Debian y Ubuntu Linux

El paquete deb jellyfin-ffmpeg* requerido por Jellyfin incluye todos los controladores necesarios en modo usuario para Rockchip MPP y RGA.

Además, solo necesitas instalar el entorno de ejecución OpenCL (libmali) y configurar los permisos del dispositivo.

nota

Se requieren permisos de root.

  1. Suponiendo que has añadido el repositorio de Jellyfin a tus fuentes de apt e instalado jellyfin-server, jellyfin-web y jellyfin-ffmpeg7.

  2. Verifica que dma_heap, dri, mpp_service y rga existan en /dev. Si no, actualiza tu kernel BSP a 5.10 LTS o superior.

    $ 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. Agrega las siguientes líneas en /etc/udev/rules.d/99-rk-device-permissions.rules. Reinicia para que surta efecto.

    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. Añade el usuario jellyfin a los grupos render y video, luego reinicia el servicio jellyfin:

    nota

    En algunas distribuciones, el grupo podría ser input.

    sudo usermod -aG render jellyfin
    sudo usermod -aG video jellyfin
    sudo systemctl restart jellyfin
  5. Instala el entorno de ejecución ARM Mali OpenCL (libmali) en el host:

    nota

    Solo es necesario antes de usar el mapeo de tonos HDR en RK3588/3588S. Esto garantiza que coincidan las versiones del firmware en espacio de usuario y el controlador del kernel, de lo contrario OpenCL no funcionará correctamente.

  6. Verifica el estado del entorno 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. Habilita RKMPP en Jellyfin y desmarca los códecs no compatibles.

Configurar con virtualización en Linux

Antes de continuar, completa los pasos 2 y 5 de la sección Configuración en host Linux. Aplica tanto para Docker como LXC.

Docker oficial

La imagen oficial de Docker incluye todos los controladores necesarios en modo usuario para MPP, RGA y OpenCL de Rockchip.

Debes pasar los archivos de dispositivo del VPU desde el host a Docker y habilitar el modo privilegiado.

nota

Se requieren permisos de root.

  1. Utiliza la línea de comandos de Docker: (la lista extensa de nombres de dispositivos entre for...done garantiza compatibilidad con versiones anteriores)

    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. Verifica el estado del entorno de ejecución OpenCL, asegurándote de tener instalado el firmware GPU de libmali.

    nota

    Solo necesario antes de usar mapeo de tonos HDR en RK3588/3588S.

    ::>

    # 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. Habilita RKMPP en Jellyfin y desmarca los códecs no compatibles.

LXC (Contenedores Linux)

Esta configuración puede ser útil para quienes usan SoC RK3588/3588S como host de Proxmox, donde LXC es el método oficial y único soportado para virtualización ligera mediante contenedores de sistema (LXC) frente a contenedores de aplicaciones (docker). Actualmente el equipo de Proxmox no admite plataformas ARM como hosts -y probablemente nunca lo hará- sin embargo, existen implementaciones exitosas en dispositivos ARM.

La configuración en LXC es similar a Docker: debes pasar los archivos de dispositivo del VPU desde el host al LXC y activar el modo privilegiado (ver también la importante "nota" abajo sobre contenedores LXC privilegiados).

  1. Para encontrar la lista de archivos de dispositivos a pasar dentro del contenedor, usa el siguiente one-liner en el host 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

    A continuación se muestra un ejemplo de la configuración mínima adicional requerida (no completa) para que la aceleración por hardware de VPU funcione:

    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

    Usa la página man de lxc.container.conf como referencia para entender qué hacen las opciones lxc.mount.entry y lxc.cgroup2.devices.
    Si lo prefieres (y tienes dudas al respecto), puedes reemplazar la regla lxc.cgroup2.devices.allow: a con una lista de dispositivos más restrictiva "allowlist device program" (ejemplos se encuentran en la misma página man), enumerando cada dispositivo de caracteres VPU que el espacio de nombres del contenedor debe poder acceder en el host.

    advertencia

    Los contenedores LXC privilegiados se consideran inseguros por diseño - lee más en la documentación oficial de LXC. Esta guía no cubre los pasos necesarios para que la aceleración por hardware VPU de Jellyfin funcione en contenedores no privilegiados.

  2. Instale el paquete compatible de jellyfin dentro del contenedor LXC o, opcionalmente, puede usar la imagen oficial de Docker dentro del contenedor LXC.

  3. Verifica el estado del runtime de OpenCL como se muestra a continuación - el ejemplo está tomado de un entorno de tiempo de ejecución LXC en Ubuntu Jammy - los pasos son idénticos para despliegues en Docker:

    • Los controladores de espacio de usuario libmali deben estar instalados dentro del contenedor LXC, de lo contrario el dispositivo opencl=ocl@rk no se inicializará
    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. Active RKMPP en la interfaz gráfica de Jellyfin, marque los códecs compatibles (y deseados) y desmarque los no compatibles - consulte la sección Seleccionar hardware SoC/VPU para más detalles.

Verificar en Linux

Para el kernel BSP anterior a 6.1.84, no existe una forma confiable de leer la carga/utilización de la VPU en SoC Rockchip.

Sin embargo, puede verificar esto leyendo otros motores, como el RGA (blitter de aceleración por hardware 2D).

nota

Se requieren permisos de root.

  1. Reproduce un video en el cliente web de Jellyfin y fuerza la transcodificación reduciendo la resolución o tasa de bits.

  2. Carga/utilización de la VPU: ejecute 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. Carga de RGA: ejecute 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 ...