- La transcodificación multihilo del CLI de FFmpeg se presentó en su primera forma “totalmente funcional” tras cerca de 2 años de trabajo y más de 700 commits preparatorios
- Como el alcance de los cambios es grande, todavía existe la posibilidad de que algunas funciones se hayan roto, y antes de una fusión real la prueba y revisión siguen siendo tareas clave
-fix_sub_duration_heartbeattiene dificultades para evitar un comportamiento no determinista en ejecución asíncrona debido a supuestos de sincronización entre el decodificador y el codificador/muxer- La sobrecarga del threading suele ser pequeña, pero en trabajos con muy poca carga por paquete el costo puede hacerse notar más que la ganancia de rendimiento
- Si el cuello de botella no está concentrado en un solo componente y cada componente no está ya multihilado, en entornos multinúcleo pueden mejorar mucho el uso de CPU y el tiempo real de procesamiento
Puntos clave del parche de multithreading para el CLI de FFmpeg
- Tras cerca de 2 años de trabajo y más de 700 commits preparatorios, se publicó como serie de parches la primera versión “fully functional” del CLI multihilo de FFmpeg
- Dado el tamaño de los cambios, puede haber roturas aún no detectadas, por lo que se necesitan pruebas y revisión basadas en casos de uso reales
- En general la sobrecarga del threading es baja, pero en cargas de trabajo con muy poco trabajo por paquete esa sobrecarga puede volverse significativa
- Si la transcodificación no está dominada por un solo componente y cada componente no está ya saturado por su propio multithreading, en sistemas multinúcleo pueden mejorar el uso de CPU y el tiempo de ejecución
Restricciones de funcionamiento y problemas conocidos
- La opción
-fix_sub_duration_heartbeatasume en la estructura actual una sincronización entre componentes separados- El flujo objetivo es una sincronización desde el codificador/muxer hacia el decodificador
- Si cada componente se ejecuta de forma asíncrona, el comportamiento se vuelve inherentemente no determinista
- Incluso ahora el comportamiento es difícil de predecir, pero si se ejecuta con la misma opción, el resultado entre ejecuciones es determinista
- En el parche 16/24 esta opción se desactiva, y se necesita una mejor forma de manejarla
Composición de la serie de 24 parches
- La serie está compuesta por un total de 24 parches
- 01-09/24 son cambios preparatorios y podrían enviarse antes que el resto de la serie
- 10-17/24 trasladan la codificación y el filtrado a hilos y realizan los cambios preparatorios necesarios
- El threading en esta etapa es un threading “falso” en el que el hilo principal espera a que otros hilos terminen, así que no hay ejecución realmente paralela
- Como la sobrecarga temporal puede ser grande o algunos casos límite podrían romperse, conviene enviarlos una vez que esté lista la serie completa
- 18/24 es el parche individual más grande y añade el scheduler de transcodificación, aunque en ese punto todavía no funciona de verdad
- 19-24/24 convierten los componentes individuales para que usen el scheduler
- Están divididos para revisión, pero en el envío final deberían combinarse
- El material relacionado puede verse en el video reciente de la charla de VDD y en la rama
ffmpeg_threading- VDD talk
- rama ffmpeg_threading
1 comentarios
Comentarios de Hacker News
En un servidor ARM de 4 núcleos, fue casi 2 veces más rápido, y no parece haber mucho overhead por la paralelización
ffmpeg_threading/ffmpegtardó 7.771 segundos, mientras que elffmpegtradicional tardó 13.841 segundos, y el uso de CPU fue de 218% y 114% respectivamenteMe pregunto qué pasaría si en una tarjeta NVIDIA se usara aceleración por hardware tanto para decodificación como para codificación de video:
ffmpeg -hwaccel cuda -i $inputFile -codec:a copy -codec:v hevc_nvenc $outputEl resto del trabajo probablemente tenga un costo relativamente pequeño en términos de rendimiento, así que la mejora es bienvenida, pero espero que el impacto real sea bastante limitado
Habría sido mejor enlazar https://ffmpeg.org/pipermail/ffmpeg-devel/2023-November/3165... en vez del tuit
Al final, el punto central del tuit es justamente ese enlace
Para entender esto, conviene ver la presentación que dio Anton en VideoLAN Dev Days 2023: https://www.youtube.com/watch?v=Z4DS3jiZhfo&t=1221
Me hace imaginar una dirección con manejo más potente de animaciones de propiedades
El tuit lleva a http://ffmpeg.org/pipermail/ffmpeg-devel/2023-November/31655..., y desde ahí se hace referencia al código https://git.khirnov.net/libav.git/log/?h=ffmpeg_threading
Me pregunto si esto se aplica automáticamente, o si hay que combinar parámetros de línea de comandos de forma complicada
Me pregunto si existe algún software de edición de video que use ffmpeg
En algún momento pensé en hacer algo que dibujara formas con SVG y usara ffmpeg, o que le agregara una UI, o que solo añadiera texto, pero nunca lo empecé
Avidemux da un poco esa impresión, y el interior de ffmpeg es bastante crudo, así que no parece pensado para que una GUI lo use directamente; por eso un editor basado en eso probablemente sería tosco, raro y difícil de mantener
Aun así, quizá podría funcionar algo como un editor modular con un visor de pipelines o un generador visual de comandos para la previsualización
ffmpeg es potente, pero el hecho de que se use solo por línea de comandos le pone barreras a algunos usuarios. Antes escribí un script de Python que tomaba una cantidad aleatoria de clips y hacía un mosaico con el filtro
xstack, y no fue nada fácilhttps://vsdb.top/
https://www.vapoursynth.com/
Como software de nicho basado en ffmpeg, he visto losslesscut: https://github.com/mifi/lossless-cut
Staxrip también es grande: https://github.com/staxrip/staxrip
Pero no conozco bien un editor “integral” completo
Ojalá las pequeñas tareas de transcodificación para Plex se vuelvan más rápidas
Mi tarjeta gráfica no soporta transcodificación por hardware, así que esto me da esperanza
Estaba buscando formas de acelerar el transcodificado, y una era la aceleración por GPU, mientras que la otra era aumentar el número de hilos
Pero ha sido difícil encontrar la cantidad óptima de hilos
Aun así, si es posible, la aceleración por GPU es mucho mejor
Me pregunto cuáles son los requisitos de licencia al desplegar ffmpeg a gran escala. ¿En qué casos hay que pagar?
http://ffmpeg.org/legal.html
O sea, es gratis, pero si usas ciertos módulos puede haber problemas al mezclarlo con código privativo
Da gusto ver que FFmpeg sigue mejorando. Ojalá pronto también veamos soporte para Dolby AC4