Saltar al contenido principal

ffmpeg-slow-processing-problem


posición_barra lateral: 2

Cómo resolver el retraso de grabación de edición de video FFmpeg, reducción de duración del video, problema de CPU 100%

Mientras editaba (grababa) video usando FFmpeg en un servidor de grabación de video en tiempo real, ocurrió un problema de retraso en la grabación. Los vídeos grabados al mismo tiempo eran más cortos en algunas computadoras. Echemos un vistazo a la situación en la que ocurrió el problema, la causa y el proceso para resolverlo.

Situación problemática

  • Existen varios servidores para grabar video en tiempo real.
    • Servidor basado en Spring Boot y Kotlin en funcionamiento
  • Cada servidor realiza la función de grabar archivos de video de entrada usando FFmpeg
  • Las especificaciones de cada servidor son ligeramente diferentes para cada servidor (no utilices el mismo hardware ni la misma instancia)

:::información FFmpeg es un proyecto de código abierto desarrollado bajo el liderazgo de Michael Niedermayer con el objetivo de decodificar y codificar todos los formatos de vídeo, música y fotografías. En detalle, es un programa que desempeña las siguientes funciones.

  1. Código abierto: FFmpeg es una herramienta de procesamiento de audio y vídeo de código abierto, gratuita para que cualquiera pueda usarla y modificarla.
  2. Multiplataforma: FFmpeg se ejecuta en Windows, macOS, Linux y muchos otros sistemas operativos.
  3. Soporte para varios formatos: FFmpeg admite cientos de formatos. Permite codificar, decodificar, convertir y transmitir video, audio, imágenes y otros datos multimedia.
  4. Codificación/decodificación de vídeo y audio: FFmpeg admite casi todos los códecs de vídeo y audio más importantes. Esto significa que los usuarios pueden codificar y decodificar archivos de vídeo y audio en una variedad de formatos.
  5. Transmisión: FFmpeg brinda la capacidad de transmitir video y audio en tiempo real. Esto se puede utilizar para crear servidores de medios o servir contenido a plataformas de transmisión en línea.
  6. Filtros y efectos: FFmpeg proporciona una variedad de filtros de video y audio para ayudarte a editar y mejorar tu contenido. Por ejemplo, puede cambiar el tamaño, recortar, rotar, corregir el color y eliminar el ruido.
  7. Interfaz de línea de comando: FFmpeg se utiliza a través de una interfaz de línea de comando. Le permite realizar una variedad de tareas multimedia utilizando comandos simples y es ideal para la automatización y el procesamiento por lotes.
  8. Formulario de biblioteca: FFmpeg también está disponible en formato de biblioteca, lo que permite que otras aplicaciones utilicen sus funciones multimedia. Se puede utilizar en software de edición de vídeo, reproductores multimedia, servidores de streaming, etc. :::

problema

  • En ciertos servidores, la codificación de video aparece más corta que la duración grabada.
    • Verifique varias causas para verificar el problema y verificar las especificaciones del servidor y el uso de recursos del sistema, como CPU, gráficos y memoria
  • Confirme que la tasa de uso de recursos del sistema es diferente entre el servidor en el entorno problemático y el servidor en funcionamiento normal.
    • Normal: El uso de la CPU no cambia significativamente y el uso de la tarjeta gráfica aumenta del 0% al 30-40%.
    • Anormal: La CPU se utiliza continuamente al 100 % y el uso de la tarjeta gráfica no aumenta.
  • Al comparar cada ambiente, existen diferencias de la siguiente manera
    • Normal: Entorno equipado con Tarjeta Gráfica externa de Nvidia. En este entorno también se pueden comprobar los desarrollos existentes.
    • Anormal: servidor equipado únicamente con gráficos integrados Intel
  • En un sistema que procesa video al 100% con la CPU sin usar la tarjeta gráfica durante un cierto período de tiempo, se supone que el video se acorta porque el procesamiento no se puede completar dentro del tiempo especificado. **
    • En el código, la función de grabación está configurada para funcionar durante un período de tiempo determinado.

Resolución

  • Busqué una manera de utilizar los gráficos integrados de Intel.
    • No sabía que los gráficos integrados de Intel tenían muy buen rendimiento.
    • Sin embargo, pensé que funcionaría mucho más eficientemente si dividiera el trabajo en lugar de usar el 100% de la CPU.

ffmpeg -códecs


![imagen](/img/2024/2024-04-03-13-22-53.png)

* Usando el comando anterior, puede verificar los códecs disponibles del ffmpeg actualmente instalado como se muestra arriba.
* Al grabar, cada servidor utilizó el códec H.264 y los modelos equipados con una tarjeta gráfica Nvidia utilizaron el codificador `h264_nvenc`.
* Los modelos equipados únicamente con gráficos integrados Intel no pueden utilizar `h264_nvenc`. Utilicé el codificador `libx264` o `libopenh264`, que eran métodos basados ​​en SW (usando CPU).
* En este momento, cuando se usaba `h264_qsv`, **el uso de la CPU no aumentó ni siquiera en un 10%, y la tasa de uso de los gráficos integrados no utilizados anteriormente aumentó en aproximadamente un 30%**. **El tiempo de grabación no se ha reducido y ahora es la duración normal.**
* Sin embargo, debido a que el codificador era diferente, la calidad de los dos videos con diferentes tarjetas gráficas parecía algo diferente.
* Adquirí conocimiento de que sólo se puede esperar un funcionamiento normal del SW cuando se utilizan bien las características del HW de cada servidor, y que incluso en los casos en que el HW es diferente, es necesario verificarlo con anticipación.

:::información
H.264 es un códec estándar de vídeo anunciado en 2003. Es una codificación de vídeo más avanzada que el MPEG-4 Parte 2 existente, por lo que también se la conoce como AVC (Codificación de vídeo avanzada). No sólo tiene una buena tasa de compresión, sino que también tiene buena calidad de imagen incluso a una tasa de bits relativamente baja, por lo que se utiliza en muchos servicios.
:::