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.
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.
-
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.
Se requieren permisos de root.
-
Suponiendo que has añadido el repositorio de Jellyfin a tus fuentes de apt e instalado
jellyfin-server,jellyfin-webyjellyfin-ffmpeg7. -
Verifica que
dma_heap,dri,mpp_serviceyrgaexistan 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 -
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" -
Añade el usuario
jellyfina los gruposrenderyvideo, luego reinicia el serviciojellyfin:notaEn algunas distribuciones, el grupo podría ser
input.sudo usermod -aG render jellyfin
sudo usermod -aG video jellyfin
sudo systemctl restart jellyfin -
Instala el entorno de ejecución ARM Mali OpenCL (libmali) en el host:
notaSolo 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.
-
Para el kernel 6.1 LTS en Ubuntu-Rockchip y Armbian, y el kernel heredado 5.10 LTS, instala v1.9-1-2131373.
-
Para el kernel 6.1 LTS en otras distros del fabricante para SBC, instala v1.9-1-55611b0.
-
-
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).
... -
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.
Se requieren permisos de root.
-
Utiliza la línea de comandos de Docker: (la lista extensa de nombres de dispositivos entre
for...donegarantiza 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 -
Verifica el estado del entorno de ejecución OpenCL, asegurándote de tener instalado el firmware GPU de libmali.
notaSolo 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 -
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).
-
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"; donedevice /dev/dri
device /dev/dma_heap
device /dev/mali0
device /dev/rga
device /dev/mpp_serviceA 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: aUsa 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.advertenciaLos 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.
-
Instale el paquete compatible de jellyfin dentro del contenedor LXC o, opcionalmente, puede usar la imagen oficial de Docker dentro del contenedor LXC.
-
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 Driverssudo /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 -- > -
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).
Se requieren permisos de root.
-
Reproduce un video en el cliente web de Jellyfin y fuerza la transcodificación reduciendo la resolución o tasa de bits.
-
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/loadEvery 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% -
Carga de RGA: ejecute
sudo watch -n 1 cat /sys/kernel/debug/rkrga/loadEvery 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 ...