Decodificación de Video
Se recomienda ampliamente utilizar una GPU integrada o discreta para la aceleración por hardware en la decodificación de video en SecureVu.
Algunos tipos de aceleración por hardware se detectan y utilizan automáticamente, pero es posible que necesites actualizar tu configuración para habilitar la decodificación acelerada por hardware en ffmpeg. Para verificar que la aceleración por hardware esté funcionando:
- Revisa los registros: Un mensaje indicará si la aceleración por hardware fue detectada automáticamente, o aparecerá una advertencia indicando que no se detectó aceleración por hardware automáticamente.
- Si la aceleración por hardware está especificada en la configuración, la verificación puede realizarse asegurándose de que los registros no contengan errores. No hay modo de respaldo a CPU para la aceleración por hardware.
SecureVu soporta presets para una decodificación de video acelerada por hardware óptima:
AMD
- AMD: SecureVu puede utilizar las GPUs integradas modernas de AMD y GPUs discretas de AMD para acelerar la decodificación de video.
Intel
- Intel: SecureVu puede utilizar la mayoría de las GPUs integradas Intel y GPUs Arc para acelerar la decodificación de video.
GPU Nvidia
- GPU Nvidia: SecureVu puede utilizar la mayoría de las GPUs Nvidia modernas para acelerar la decodificación de video.
Raspberry Pi 3/4
- Raspberry Pi: SecureVu puede utilizar el motor de medios del Raspberry Pi 3 y 4 para acelerar ligeramente la decodificación de video.
Nvidia Jetson Community Supported
- Jetson: SecureVu puede utilizar el motor de medios en hardware Jetson para acelerar la decodificación de video.
Rockchip Community Supported
- RKNN: SecureVu puede utilizar el motor de medios en SoCs RockChip para acelerar la decodificación de video.
Otro Hardware
Dependiendo de tu sistema, estos presets pueden no ser compatibles y es posible que necesites usar argumentos hwaccel manuales para aprovechar tu hardware. Más información sobre la decodificación acelerada por hardware para ffmpeg puede encontrarse aquí: https://trac.ffmpeg.org/wiki/HWAccelIntro
CPUs basados en Intel
SecureVu puede utilizar la mayoría de las GPUs integradas Intel y GPUs Arc para acelerar la decodificación de video.
Preset hwaccel Recomendado
| Generación de CPU | Driver Intel | Preset Recomendado | Notas |
|---|---|---|---|
| gen1 - gen5 | i965 | preset-vaapi | qsv no es compatible, puede no soportar H.265 |
| gen6 - gen7 | iHD | preset-vaapi | qsv no es compatible |
| gen8 - gen12 | iHD | preset-vaapi | preset-intel-qsv-* también puede utilizarse |
| gen13+ | iHD / Xe | preset-intel-qsv-* | |
| GPU Intel Arc | iHD / Xe | preset-intel-qsv-* |
El driver predeterminado es iHD. Es posible que necesites cambiar el driver a i965 añadiendo la siguiente variable de entorno LIBVA_DRIVER_NAME=i965 en tu archivo docker-compose o en el config.yml para usuarios de la App HA.
Consulta la documentación de Intel para determinar qué generación tiene tu CPU.
Mediante VAAPI
VAAPI soporta selección automática de perfil, por lo que funcionará automáticamente tanto con transmisiones H.264 como H.265.
ffmpeg:
hwaccel_args: preset-vaapi
Mediante Quicksync
Transmisiones H.264
ffmpeg:
hwaccel_args: preset-intel-qsv-h264
Transmisiones H.265
ffmpeg:
hwaccel_args: preset-intel-qsv-h265
Configurar estadísticas de GPU Intel en Docker
Se necesita configuración adicional para que el contenedor Docker pueda acceder al comando intel_gpu_top para obtener estadísticas de GPU. Hay dos opciones:
- Ejecutar el contenedor en modo privilegiado.
- Agregar la capacidad
CAP_PERFMON(nota: es posible que necesites establecerperf_event_paranoidlo suficientemente bajo para permitir el acceso al sistema de eventos de rendimiento).
Ejecutar como privilegiado
Este método funciona, pero otorga más permisos al contenedor de los que realmente se necesitan.
Docker Compose - Privilegiado
services:
securevu:
...
image: ghcr.io/securecorp-mexico/securevu2:stable
privileged: true
Docker Run CLI - Privilegiado
docker run -d \
--name securevu \
...
--privileged \
ghcr.io/securecorp-mexico/securevu2:stable
CAP_PERFMON
Solo las versiones recientes de Docker soportan la capacidad CAP_PERFMON. Puedes probar si la tuya la soporta ejecutando: docker run --cap-add=CAP_PERFMON hello-world
Docker Compose - CAP_PERFMON
services:
securevu:
...
image: ghcr.io/securecorp-mexico/securevu2:stable
cap_add:
- CAP_PERFMON
Docker Run CLI - CAP_PERFMON
docker run -d \
--name securevu \
...
--cap-add=CAP_PERFMON \
ghcr.io/securecorp-mexico/securevu2:stable
perf_event_paranoid
Nota: Este ajuste debe cambiarse para todo el sistema.
Para más información sobre los distintos valores en diferentes distribuciones, consulta https://askubuntu.com/questions/1400874/what-does-perf-paranoia-level-four-do.
Dependiendo de tu sistema operativo y configuración del kernel, es posible que necesites cambiar el parámetro del kernel /proc/sys/kernel/perf_event_paranoid. Puedes probar el cambio ejecutando sudo sh -c 'echo 2 >/proc/sys/kernel/perf_event_paranoid', que persistirá hasta un reinicio. Para hacerlo permanente, ejecuta sudo sh -c 'echo kernel.perf_event_paranoid=2 >> /etc/sysctl.d/local.conf'
Estadísticas para SR-IOV u otros dispositivos
Al usar GPUs virtualizadas mediante SR-IOV, necesitas especificar la ruta del dispositivo para recopilar estadísticas de intel_gpu_top. Este ejemplo puede funcionar para algunos sistemas que utilizan SR-IOV:
telemetry:
stats:
intel_gpu_device: "sriov"
Para otras GPUs virtualizadas, intenta especificar la ruta directa al dispositivo:
telemetry:
stats:
intel_gpu_device: "drm:/dev/dri/card0"
Si estás proporcionando una ruta de dispositivo, asegúrate de haberlo pasado al contenedor.
CPUs basados en AMD
SecureVu puede utilizar las GPUs integradas modernas de AMD y GPUs AMD para acelerar la decodificación de video usando VAAPI.
Configurar el driver Radeon
Necesitas cambiar el driver a radeonsi añadiendo la siguiente variable de entorno LIBVA_DRIVER_NAME=radeonsi en tu archivo docker-compose o en el config.yml para usuarios de la App HA.
Mediante VAAPI
VAAPI soporta selección automática de perfil, por lo que funcionará automáticamente tanto con transmisiones H.264 como H.265.
ffmpeg:
hwaccel_args: preset-vaapi
GPUs NVIDIA
Aunque las GPUs antiguas pueden funcionar, se recomienda usar GPUs modernas y compatibles. NVIDIA proporciona una matriz de GPUs y características soportadas. Si tu tarjeta está en la lista y soporta CUVID/NVDEC, lo más probable es que funcione con SecureVu para decodificación. Sin embargo, también debes usar una versión del driver que funcione con FFmpeg. Las versiones antiguas del driver pueden tener símbolos faltantes y fallar, y las tarjetas antiguas no son compatibles con las versiones más nuevas del driver. La única solución es proporcionar tu propio FFmpeg que funcione con tu versión del driver, pero esto no está soportado y puede no funcionar bien.
Una lista más completa de tarjetas y sus drivers compatibles está disponible en el readme de la versión del driver.
Si tu distribución no ofrece paquetes de drivers NVIDIA, puedes descargarlos aquí.
Configurar GPUs Nvidia en Docker
Se necesita configuración adicional para que el contenedor Docker pueda acceder a la GPU NVIDIA. El método soportado es instalar el NVIDIA Container Toolkit y especificar la GPU a Docker. La forma de hacerlo depende de cómo se esté ejecutando Docker:
Docker Compose - GPU Nvidia
services:
securevu:
...
image: ghcr.io/securecorp-mexico/securevu2:stable-tensorrt
deploy: # <------------- Agregar esta sección
resources:
reservations:
devices:
- driver: nvidia
device_ids: ['0'] # esto solo es necesario cuando se usan múltiples GPUs
count: 1 # número de GPUs
capabilities: [gpu]
Docker Run CLI - GPU Nvidia
docker run -d \
--name securevu \
...
--gpus=all \
ghcr.io/securecorp-mexico/securevu2:stable-tensorrt
Configurar el decodificador
Usando preset-nvidia, ffmpeg seleccionará automáticamente el perfil necesario para el video entrante y registrará un error si el perfil no es compatible con tu GPU.
ffmpeg:
hwaccel_args: preset-nvidia
Si todo funciona correctamente, deberías ver una mejora significativa en el rendimiento.
Verifica que la decodificación por hardware está funcionando ejecutando nvidia-smi, que debería mostrar los procesos ffmpeg:
nvidia-smi no mostrará los procesos ffmpeg cuando se ejecuta dentro del contenedor debido a las limitaciones de docker.
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.38 Driver Version: 455.38 CUDA Version: 11.1 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 GeForce GTX 166... Off | 00000000:03:00.0 Off | N/A |
| 38% 41C P2 36W / 125W | 2082MiB / 5942MiB | 5% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 12737 C ffmpeg 249MiB |
| 0 N/A N/A 12751 C ffmpeg 249MiB |
| 0 N/A N/A 12772 C ffmpeg 249MiB |
| 0 N/A N/A 12775 C ffmpeg 249MiB |
| 0 N/A N/A 12800 C ffmpeg 249MiB |
| 0 N/A N/A 12811 C ffmpeg 417MiB |
| 0 N/A N/A 12827 C ffmpeg 417MiB |
+-----------------------------------------------------------------------------+
Si no ves estos procesos, revisa los docker logs del contenedor y busca errores de decodificación.
Estas instrucciones se basaron originalmente en la documentación de Jellyfin.
Raspberry Pi 3/4
Asegúrate de aumentar la RAM asignada para tu GPU a al menos 128 (raspi-config > Opciones de rendimiento > Memoria GPU).
Si estás usando la App HA, es posible que necesites usar la variante de acceso completo y desactivar el Modo de protección para la aceleración por hardware.
# si deseas decodificar una transmisión h264
ffmpeg:
hwaccel_args: preset-rpi-64-h264
# si deseas decodificar una transmisión h265 (hevc)
ffmpeg:
hwaccel_args: preset-rpi-64-h265
Si ejecutas SecureVu a través de Docker, necesitas ejecutarlo en modo privilegiado o
mapear los dispositivos /dev/video* a SecureVu. Con Docker Compose agrega:
services:
securevu:
...
devices:
- /dev/video11:/dev/video11
O con docker run:
docker run -d \
--name securevu \
...
--device /dev/video11 \
ghcr.io/securecorp-mexico/securevu2:stable
/dev/video11 es el dispositivo correcto (en Raspberry Pi 4B). Puedes verificarlo
ejecutando lo siguiente y buscando H264:
for d in /dev/video*; do
echo -e "---\n$d"
v4l2-ctl --list-formats-ext -d $d
done
O mapea todos los dispositivos /dev/video*.
Con soporte de la comunidad
NVIDIA Jetson
Hay un conjunto separado de imágenes Docker disponibles para dispositivos Jetson. Incluyen una compilación de ffmpeg con codecs que utilizan el motor de medios dedicado del Jetson. Si tu host Jetson ejecuta Jetpack 6.0 o superior, usa la imagen con la etiqueta stable-tensorrt-jp6. Ten en cuenta que el Orin Nano no tiene codificador de video, por lo que SecureVu usará codificación por software en esta plataforma, pero la imagen aún permite la decodificación por hardware y la detección de objetos con TensorRT.
Necesitarás usar la imagen con el runtime de nvidia:
Docker Run CLI - Jetson
docker run -d \
...
--runtime nvidia
ghcr.io/securecorp-mexico/securevu2:stable-tensorrt-jp6
Docker Compose - Jetson
services:
securevu:
...
image: ghcr.io/securecorp-mexico/securevu2:stable-tensorrt-jp6
runtime: nvidia # Agregar esto
La etiqueta runtime: no es compatible con versiones anteriores de docker-compose. Si encuentras este problema, puedes usar el runtime de nvidia a nivel de sistema agregando "default-runtime": "nvidia" a /etc/docker/daemon.json:
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia"
}
Configurar el decodificador
El decodificador que necesitas pasar en hwaccel_args dependerá del video de entrada.
Una lista de codecs soportados (puedes usar ffmpeg -decoders | grep nvmpi dentro del contenedor para obtener los que soporta tu tarjeta)
V..... h264_nvmpi h264 (nvmpi) (codec h264)
V..... hevc_nvmpi hevc (nvmpi) (codec hevc)
V..... mpeg2_nvmpi mpeg2 (nvmpi) (codec mpeg2video)
V..... mpeg4_nvmpi mpeg4 (nvmpi) (codec mpeg4)
V..... vp8_nvmpi vp8 (nvmpi) (codec vp8)
V..... vp9_nvmpi vp9 (nvmpi) (codec vp9)
Por ejemplo, para video H264, seleccionarás preset-jetson-h264.
ffmpeg:
hwaccel_args: preset-jetson-h264
Si todo funciona correctamente, deberías ver una reducción significativa en la carga de CPU de ffmpeg y el consumo de energía.
Verifica que la decodificación por hardware está funcionando ejecutando jtop (sudo pip3 install -U jetson-stats), que debería mostrar
que NVDEC/NVDEC1 están en uso.
Plataforma Rockchip
La aceleración por hardware para codificación y decodificación de video es compatible con todos los SoCs Rockchip usando el Fork de FFmpeg 6.1 de Nyanmisaka basado en la biblioteca mpp de Rockchip.
Requisitos previos
Asegúrate de seguir las instrucciones de instalación específicas de Rockchip.
Configuración
Agrega uno de los siguientes presets de FFmpeg a tu config.yml para habilitar el procesamiento de video por hardware:
ffmpeg:
hwaccel_args: preset-rkmpp
Asegúrate de que tu SoC admita la aceleración por hardware para tu transmisión de entrada. Por ejemplo, si tu cámara transmite con codificación h265 y resolución 4k, tu SoC debe ser capaz de codificar y decodificar h265 con resolución 4k o superior. Si no estás seguro de si tu SoC cumple los requisitos, consulta la hoja de datos.
Si una o más de tus cámaras no se procesan correctamente y este error aparece en los registros:
[segment @ 0xaaaaff694790] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[Parsed_scale_rkrga_0 @ 0xaaaaff819070] No hw context provided on input
[Parsed_scale_rkrga_0 @ 0xaaaaff819070] Failed to configure output pad on Parsed_scale_rkrga_0
Error initializing filters!
Error marking filters as finished
[out#1/rawvideo @ 0xaaaaff3d8730] Nothing was written into output file, because at least one of its streams received no packets.
Restarting ffmpeg...
deberías intentar actualizar a FFmpeg 7. Esto puede hacerse usando esta opción de configuración:
ffmpeg:
path: "7.0"
Puedes establecer esta opción globalmente para usar FFmpeg 7 para todas las cámaras, o a nivel de cámara para usarlo solo en cámaras específicas. No confundas esta opción con:
cameras:
name:
ffmpeg:
inputs:
- path: rtsp://viewer:{SECUREVU_RTSP_PASSWORD}@10.0.10.10:554/cam/realmonitor?channel=1&subtype=2
Synaptics
La aceleración por hardware para codificación y decodificación de video es compatible con los SoCs de la serie SL de Synaptics.
Requisitos previos
Asegúrate de seguir las instrucciones de instalación específicas de Synaptics.
Configuración
Agrega uno de los siguientes presets de FFmpeg a tu config.yml para habilitar el procesamiento de video por hardware:
ffmpeg:
hwaccel_args: -c:v h264_v4l2m2m
input_args: preset-rtsp-restream
output_args:
record: preset-record-generic-audio-aac
Asegúrate de que tu SoC admita la aceleración por hardware para tu transmisión de entrada y que dicha transmisión use codificación h264. Por ejemplo, si tu cámara transmite con codificación h264, tu SoC debe ser capaz de codificar y decodificar con ella. Si no estás seguro de si tu SoC cumple los requisitos, consulta la hoja de datos.