Saltar al contenido principal

Transcodificación por Hardware

Esta función te permite utilizar una GPU para acelerar la transcodificación y reducir la carga del procesador. Ten en cuenta que la transcodificación por hardware produce videos significativamente más grandes que la transcodificación por software con configuraciones similares, generalmente con menor calidad. Usar presets lentos y preferir códecs más eficientes puede reducir esta brecha. Dado que esta es una función nueva, aún es experimental y puede que no funcione en todos los sistemas.

información

No necesitas rehacer ningún trabajo de transcodificación después de habilitar la aceleración por hardware. El dispositivo de aceleración se usará para cualquier trabajo que se ejecute después de habilitarlo.

APIs compatibles

  • NVENC (NVIDIA)
  • Quick Sync (Intel)
  • RKMPP (Rockchip)
  • VAAPI (AMD / NVIDIA / Intel)

Limitaciones

  • Las instrucciones y configuraciones aquí son específicas de Docker Compose. Otros motores de contenedores pueden requerir configuraciones diferentes.
  • Solo se admiten servidores Linux y Windows (a través de WSL2).
  • WSL2 no admite Quick Sync.
  • Raspberry Pi no es compatible actualmente.
  • El modo de dos pasadas solo es compatible con NVENC. Otras APIs ignorarán esta configuración.
  • Por defecto, solo la codificación está acelerada por hardware actualmente. Esto significa que el procesador aún se utiliza para la decodificación por software y el tone-mapping.
    • Puedes beneficiarte de una aceleración de extremo a extremo habilitando la decodificación por hardware en la configuración de transcodificación de video.
  • Dependiente del hardware
    • El soporte de códecs varía, pero H.264 y HEVC suelen estar soportados.
      • Cabe destacar que las GPUs de NVIDIA y AMD no admiten la codificación VP9.
    • Los dispositivos más nuevos tienden a tener una calidad de transcodificación más alta.

Prerrequisitos

NVENC

  • Debes tener instalado el controlador oficial de NVIDIA en el servidor.
  • En Linux (excepto WSL2), también necesitas tener instalado el NVIDIA Container Toolkit.

QSV

  • Para que VP9 funcione:
    • Debes tener una CPU Intel de 9ª generación o más reciente
    • Si tienes una CPU de 11ª generación o anterior, entonces es posible que debas seguir estas instrucciones, ya que se requiere el modo de baja potencia.
    • Además, si el servidor tiene específicamente una CPU de 11ª generación y está ejecutando el kernel 5.15 (incluido con Ubuntu 22.04 LTS), entonces tendrás que actualizar este kernel (según docs de Jellyfin)

RKMPP

Para que RKMPP funcione:

  • Debes tener un SoC ARM Rockchip compatible.
  • Solo RK3588 admite tone-mapping por hardware, otros SoCs usan un tone-mapping más lento por software mientras siguen usando codificación por hardware.
  • El tone-mapping requiere que /usr/lib/aarch64-linux-gnu/libmali.so.1 esté presente en tu sistema anfitrión. Instala la versión de libmali correspondiente a tu GPU Mali (libmali-valhall-g610-g13p0-gbm en RK3588) y modifica el archivo hwaccel.transcoding.yml:
    • bajo rkmpp descomenta las 3 líneas requeridas para el tone-mapping de OpenCL eliminando el símbolo # al principio de cada línea
    • - /dev/mali0:/dev/mali0
    • - /etc/OpenCL:/etc/OpenCL:ro
    • - /usr/lib/aarch64-linux-gnu/libmali.so.1:/usr/lib/aarch64-linux-gnu/libmali.so.1:ro

Configuración

Configuración básica

  1. Si aún no lo tienes, descarga la última versión del archivo hwaccel.transcoding.yml y asegúrate de que esté en la misma carpeta que el archivo docker-compose.yml.

  2. En el archivo docker-compose.yml bajo immich-server, descomenta la sección extends y cambia cpu al backend adecuado.

    Nota: Para VAAPI en WSL2, asegúrate de usar vaapi-wsl en lugar de vaapi

  3. Vuelve a desplegar el contenedor immich-server con estas configuraciones actualizadas.

  4. En la página de administración bajo Configuración de transcodificación de video, cambia la configuración de aceleración por hardware a la opción adecuada y guarda.

    Nota: Para las CPUs Jasper Lake y Elkhart Lake, deberás configurar el modo Aceleración de hardware -> Modo de calidad constante a CQP

  5. (Opcional) Habilita la decodificación por hardware para rendimiento óptimo.

Archivo Compose único

Algunas plataformas, incluido Unraid y Portainer, no admiten múltiples archivos Compose al momento de escribir esto. Como alternativa, puedes "incrustar" el contenido relevante del archivo hwaccel.transcoding.yml directamente en el servicio immich-server.

Por ejemplo, la sección qsv en este archivo es:

devices:
- /dev/dri:/dev/dri

Puedes agregar esto al servicio immich-server en lugar de extender desde hwaccel.transcoding.yml:

immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
# Nota la ausencia de una sección `extends`
devices:
- /dev/dri:/dev/dri
volumes:
...

Una vez hecho esto, puedes continuar al paso 3 de "Configuración básica".

Configuración Todo-en-Uno - Unraid

QSV
  1. Unraid > Docker > (Detener) Contenedor Immich > Editar
  2. Desplázate hacia abajo y selecciona Agregar otro Camino, Puerto, Variable, Etiqueta o Dispositivo
  3. En el menú desplegable, selecciona Dispositivo y una entrada con cualquier nombre y el valor /dev/dri.
  4. Continúa con el paso 4 de "Configuración básica".
NVENC
  1. En la aplicación del contenedor, agrega esta variable ambiental: Clave=NVIDIA_VISIBLE_DEVICES Valor=all
  2. Mientras sigues en la aplicación del contenedor, cambia el contenedor de Modo Básico a Modo Avanzado y agrega el siguiente parámetro al campo Parámetros Extra: --runtime=nvidia
  3. Reinicia la aplicación del contenedor.
  4. Continúa con el paso 4 de "Configuración básica".

Consejos

  • Puede que desees elegir un preset más lento que para la transcodificación por software para mantener la calidad y eficiencia.
  • Aunque puedes usar VAAPI con dispositivos NVIDIA e Intel, prefiere las APIs más específicas ya que están más optimizadas para sus dispositivos respectivos.
  • Puedes confirmar que el dispositivo está siendo reconocido y usado verificando su utilización (mediante nvtop para NVIDIA, intel_gpu_top para Intel, etc.) durante la transcodificación. La ausencia de registros de errores durante la transcodificación también indica que se está utilizando.