Saltar al contenido

Aceleración de hardware

Jellyfin soporta la aceleración por hardware (HWA) de la codificación/decodificación de video usando FFMpeg. FFMpeg y Jellyfin pueden soportar múltiples implementaciones de aceleración de hardware como Intel Quicksync (QSV), AMD AMF, nVidia NVENC/NVDEC, OpenMax OMX y MediaCodec a través de APIs de aceleración de video.

VAAPI es una API de aceleración de vídeo que utiliza libva para interactuar con los controladores locales para proporcionar HWA. QSV utiliza una versión modificada (bifurcada) de VAAPI y la interconecta con libmfx y sus controladores propietarios (lista de procesadores compatibles con QSV).

Aceleración de hardware
Aceleración de hardware

OSAceleración HW recomendadaLinuxQSV, NVENC, VAAPIWindowsQSV, NVENC, AMF, VAAPIMacOSNone (VideoToolbox Coming Soon)AndroidMediaCodec, OMXRPiOMX

Comparación de tarjetas gráficas usando HWA

NVIDIA usando la lista oficial de ffmpeg. No todas las tarjetas han sido probadas. Estos controladores están recomendados para Linux y Windows. Aquí está la lista oficial de tarjetas gráficas NVIDIA para los codecs soportados. Ejemplo de Ubuntu trabajando con NVENC. H264 10-bit no es compatible con la aceleración de NVIDIA.

Lista de códecs soportados por VAAPI.

El soporte de AMF Linux aún no es oficial y las tarjetas AMD GFX deben usar VAAPI en Linux.

El Zen es sólo la CPU. No hay aceleración por hardware para ninguna forma de decodificación/codificación de video. Necesitará una APU o una dGPU para la aceleración por hardware.

Intel QSV Benchmarks en Linux.

En Windows, puedes usar las bibliotecas DXVA2/D3D11VA para la decodificación y la biblioteca libmfx para la codificación.

CentOS puede requerir conductores adicionales para el QSV.

Aquí hay información adicional para saber más.

Habilitación de la aceleración por hardware

Las opciones de aceleración por hardware se pueden encontrar en el Admin Dashboard en la sección Transcoding . Seleccione una opción de aceleración de hardware válida en el menú desplegable, indique un dispositivo si es aplicable y marque habilitar la codificación de hardware para habilitar la codificación así como la decodificación, si su hardware lo admite.

La aceleración por hardware está disponible inmediatamente para la reproducción de medios. No es necesario reiniciar el servidor.

Configuración

Cada tipo de aceleración de hardware, así como cada tipo de instalación de Jellyfin, requiere diferentes opciones de configuración antes de que pueda ser utilizado. Siempre es mejor consultar la documentación de FFMpeg sobre el tipo de aceleración que elija para obtener la última información.

Aceleración en Docker

Para poder utilizar la aceleración por hardware en el Docker, los dispositivos deben ser pasados al contenedor. Para ver qué dispositivos de vídeo están disponibles, puedes ejecutar sudo lshw -c video o vainfo en tu máquina.

Nota

Las GPU de NVIDIA no están actualmente soportadas en el Docker-Compose.

Puedes usar Docker Run para iniciar el servidor con un comando como el siguiente.

docker run -d  --volumen /ruta/ a/config:/config  --volumen /ruta/ a/cache:/cache  --volumen /ruta/ a/media:/media  ~ -user 1000: 1000 --net=host  --restart=unless-stop  --dev /dev/dri/renderD128:/dev/dri/renderD128  --dev /dev/dri/card0:/dev/dri/card0  ~ jellyfin/jellyfin

Alternativamente, puedes usar docker-compose con un archivo de configuración para no tener que ejecutar un comando largo cada vez que reinicies tu servidor.

versión: "3" servicios: jellyfin: imagen: jellyfin/usuario de jellyfin: 1000:1000 modo_de_red: volúmenes "host": - /path/to/config:/config - /path/to/cache:/cache - /path/to/media:/media dispositivos: # Dispositivos VAAPI - /dev/dri/renderD128:/dev/dri/renderD128 - /dev/dri/card0:/dev/dri/card0 # RPi 4 - /dev/vchiq:/dev/qchiq

Debian Docker Nvidia

Para lograr la aceleración del hardware usando el docker, se requieren varios pasos.

Requisitos previos:

https://github.com/nvidia/nvidia-docker/wiki/Installation-(versión-2.0)

GNU/Linux x86_64 con la versión del kernel; 3.10Docker;= 1.12GPU de NVIDIA con la arquitectura; Fermi (2.1)Controladores de NVIDIA ~= 361.93 (no probados en versiones anteriores)

Confirme que su GPU aparece con este comando.

lspci | grep VGA

Actualiza tu host para que no haya posibilidad de que un software anticuado cause problemas.

apt-get update && apt-get dist-upgrade -y

Instalar el rizo que se utilizará para descargar los archivos necesarios.

apt-get install curl

Edite sources.list en /etc/apt/sources.list y añada contribuciones no gratuitas a cada fuente según sea necesario.

deb http://ftp.ch.debian.org/debian/ stretch main

La línea de arriba debe ser modificada para que coincida con la siguiente línea como ejemplo.

deb http://ftp.ch.debian.org/debian/ stretch main non-free contrib

Descargue y añada las fuentes del contenedor del muelle de Nvidia.

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key adddistribution=$(. /etc/os-release;echo $ID$VERSION_ID)curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

Actualice su lista de paquetes de nuevo para descargar el último software disponible en el nuevo repositorio.

apt-get update

Instale los linux-headers y ejecute el siguiente comando.

apt-get install linux-headers-$(uname -r | sed $0027s/[^-]*-[^-]*-//$0027)

Alternativamente, ejecute este comando si está en la carrera por la compatibilidad.

apt-get install -t stretch-backports linux-headers-$(uname -r | sed $0027s/[^-]*-[^-]*-//$0027)

Instalar Nvidia docker2 desde el repositorio.

apt-get install nvidia-docker2

Cuando se le pida que elija mantener o instalar el paquete de mantenimiento, teclee y para instalar la versión de mantenimiento.

Después de la instalación puede que quieras añadir nvidia como tiempo de ejecución por defecto: editando /etc/docker/daemon.json de esta manera:

<"Default Runtime": "nvidia", "runtimes": { "nvidia": { "camino": "nvidia-contenedor-tiempo de ejecución", "runtimeArgs": [] } }}

Reinicie los servicios de los estibadores que estén funcionando actualmente.

sudo pkill -SIGHUP docker

Instalar controladores y dependencias de nvidia.

apt-get install -t stretch-backports nvidia-driver libnvcuvid1 libnvidia-encode1 libcuda1 nvidia-smi

Reinicie su anfitrión para aplicar todos los cambios.

reiniciar ahora

Valide que su conductor y su acoplador estén correctamente configurados con esta prueba de conducción.

nvidia-smidocker run --gpus 0 nvidia/cuda:9.0-base nvidia-smi

Validar el acceso a los recursos necesarios del huésped y del estibador.

ldconfig -p | grep cuvidldconfig -p | grep libnvidia-encode.so.1

Comienza tu contenedor añadiendo esos parámetros del entorno.

-e "NVIDIA_DRIVER_CAPABILITIES=all" -e NVIDIA_VISIBLE_DEVICES=all --runtime=nvidia --gpus all 

Un comando de ejecución completo se vería así.

docker run -d  --name=jellyfin  -e NVIDIA_DRIVER_CAPABILITIES=all  -e NVIDIA_VISIBLE_DEVICES=all  --gpus all  --runtime=nvidia  -p 8096: 8096 -p 8920:8920 -v /config:/config  -v /media:/media  -v /cache:/cache  --restaurar a menos que se detenga  ~ jellyfin/jellyfin

Hay algunos pasos especiales cuando se corre con la siguiente opción.

--user 1000:1000

Es posible que tengas que añadir este usuario al grupo de vídeo.

usermod -aG video user

Una vez que el contenedor se inicia, puede volver a validar el acceso a los recursos del anfitrión.

docker exec -it jellyfin ldconfig -p | grep cuviddocker exec -it jellyfin ldconfig -p | grep libnvidia-encode.so.1

Ahora ve a la configuración de reproducción de Jellyfin, habilita Nvidia NVENC y selecciona los codecs de destino dependiendo de lo que tu GPU soporte para reproducir cualquier archivo que necesite una transcodificación. Cambiar la tasa de bits es una buena manera de probar esto.

Revise los registros de transcodificación para asegurarse de que todo funciona correctamente.

Stream #0:0 -----; #0:0 (h264 (h264_cuvid) -------; h264 (h264_nvenc))Stream #0:2 -------; #0:1 (ac3 (nativo) -------; aac (nativo))<-pre>

Configurando la aceleración de VAAPI en Debian/Ubuntu desde los paquetes .deb

La configuración de VAAPI en Debian/Ubuntu requiere alguna configuración adicional para asegurar que los permisos son correctos.

Para comprobar la información sobre VAAPI en su sistema, instale y ejecute vainfo desde la línea de comandos.

  1. Configure VAAPI para su sistema siguiendo la documentación relevante. Verifica que ahora hay un dispositivo de render en /dev/dri, y toma nota de los permisos y el grupo disponible para escribir en él, en este caso render:$ ls -l /dev/dritotal 0drwxr-xr-x 2 root 100 Apr 13 16: 37 by-pathcrw-rw---- 1 root video 226, 0 Apr 13 16:37 card0crw-rw---- 1 root video 226, 1 Apr 13 16:37 card1crw-rw---- 1 root render 226, 128 Apr 13 16:37 renderD128NotaEn algunas versiones, el grupo puede ser video en lugar de render.
  2. Añada el usuario del servicio Jellyfin al grupo anterior para permitir el acceso del proceso FFMpeg de Jellyfin al dispositivo, y reinicie Jellyfin.
sudo usermod -aG render jellyfinsudo systemctl restart jellyfin
  1. Configura la aceleración de VAAPI en la página "Transcodificación" del panel de administración. Introduzca el dispositivo /dev/dri/renderD128 de arriba como el valor del dispositivo de la API de VA.
  2. Vea una película, y verifique que la transcodificación está ocurriendo viendo los registros de ffmpeg-transcode-*.txt bajo /var/log/jellyfin y usando radeontop o herramientas similares.

Contenedor LXC o LXD

Esto ha sido probado con LXC 3.0 y puede o no funcionar con versiones anteriores.

Siga los pasos anteriores para agregar al usuario de jellyfin al video o al grupo de renderización, dependiendo de sus circunstancias.

  1. Añade tu GPU al contenedor.
$ lxc config device add &lt;container name&gt; gpu gpu gid=&lt;gid de su video o grupo de renderización;
  1. Asegúrate de que tienes la tarjeta dentro del contenedor:
$ lxc exec jellyfin -- ls -l /dev/dritotal 0crw-rw---- 1 root video 226, 0 Jun 4 02:13 card0crw-rw---- 1 root video 226, 0 Jun 4 02:13 controlD64crw-rw---- 1 root video 226, 128 Jun 4 02:13 renderD128
  1. Configura Jellyfin para usar la aceleración de video y apúntalo al dispositivo correcto si la opción predeterminada es incorrecta.
  2. Intenta reproducir un video que requiera transcodificación y ejecuta lo siguiente, deberías obtener un acierto.
$ ps aux | grep ffmpeg | grep accel
  1. También puedes probar a reproducir un video que requiera transcodificación, y si se reproduce eres bueno.

Recursos útiles:

Frambuesa Pi 3 y 4

  1. Añade el usuario del servicio Jellyfin al grupo de video para permitir el acceso del proceso FFMpeg de Jellyfin al codificador, y reinicia Jellyfin.sudo usermod -aG video jellyfinsudo systemctl restart jellyfinNoteSi estás usando un Raspberry Pi 4, puede que necesites ejecutar sudo rpi-update para las actualizaciones del kernel y del firmware.
  2. Elija OpenMAX OMX como aceleración de hardware en la pestaña de Transcodificación del Tablero del Servidor.
  3. Cambiar la cantidad de memoria asignada a la GPU. La GPU no puede manejar la decodificación y codificación acelerada simultáneamente.sudo nano /boot/config.txt Para RPi4, agregue la línea gpu_mem=320Ver más Aquí Para RPi3, agregue la línea gpu_mem=256 Puede establecer cualquier valor, pero 320 es la cantidad recomendada para 4K HEVC. Verifica la división entre la CPU y la memoria de la GPU:vcgencmd get_mem arm &amp;&amp; vcgencmd get_mem gpu Monitoriza la temperatura y la velocidad del reloj de la CPU:vcgencmd measure_temp &amp;&amp; vcgencmd measure_clock arm
Nota

RPi4 actualmente no soporta la decodificación de HWA, sólo la codificación de HWA de H.264. Se requiere refrigeración activa, la refrigeración pasiva es insuficiente para la transcodificación. En las pruebas de RPi3, la transcodificación no funcionaba lo suficientemente rápido como para funcionar en tiempo real porque el vídeo estaba siendo redimensionado.

Verificando Transcódigos

Para verificar que está usando las bibliotecas adecuadas, ejecute este comando contra su registro de transcodificación. Esto se puede encontrar en Admin Dashboard> Logs, y en /var/log/jellyfin si es a través del repositorio.

grep -A2 "Mapeo de corrientes: /var/log/jellyfin/ffmpeg-transcode-85a68972-7129-474c-9c5d-2d9949021b44.txt

Esto arrojó los siguientes resultados.

Mapeo de corrientes:Corriente #0:0 ----; #0:0 (hevc (nativo) ----; h264 (h264_omx))Corriente #0:1 ----; #0:1 (aac (nativo) ----; mp3 (libmp3lame))

La corriente #0:0 usaba software para decodificar HEVC y usaba HWA para codificar.

La corriente #0:1 tuvo los mismos resultados. La decodificación es más fácil que la codificación, así que estos son buenos resultados en general. La decodificación de HWA es un trabajo en progreso.

es_ESEspañol