FFmpeg es verdaderamente una aparejo múltiple para el procesamiento de medios. Como aparejo normalizado de la industria, admite una amplia variedad de códecs y formatos de contenedores de audio y video. Asimismo puede orquestar cadenas complejas de filtros para la publicación y manipulación de medios. Para las personas que usan nuestras aplicaciones, FFmpeg juega un papel importante al permitir nuevas experiencias de video y mejorar la confiabilidad de las existentes.
Meta ejecuta ffmpeg (la aplicación CLI principal) y sonda ff (una utilidad para obtener propiedades de archivos multimedia) binarios decenas de miles de millones de veces al día, lo que presenta desafíos únicos al tratar con archivos multimedia. FFmpeg puede realizar fácilmente la transcodificación y publicación de archivos individuales, pero nuestros flujos de trabajo tienen requisitos adicionales para satisfacer nuestras deyección. Durante muchos primaveras, tuvimos que esperar en nuestra propia escisión de FFmpeg desarrollada internamente para proporcionar funciones que se han anexo recientemente a FFmpeg, como codificación multicanal roscada y cálculo de métricas de calidad en tiempo existente.
Con el tiempo, nuestra escisión interna llegó a distinguirse significativamente de la traducción antecedente de FFmpeg. Al mismo tiempo, las nuevas versiones de FFmpeg brindaron soporte para nuevos códecs y formatos de archivos, y mejoras en la confiabilidad, todo lo cual nos permitió incorporar contenido de video más diverso de los usuarios sin interrupciones. Esto requirió que admitiéramos ambas versiones recientes de código extenso de FFmpeg próximo con nuestra escisión interna. Esto no solo creó un conjunto de características gradualmente divergentes, sino que igualmente creó desafíos en torno a cambiar de forma segura nuestros cambios internos para evitar regresiones.
A medida que nuestra escisión interna se volvió cada vez más obsoleta, colaboramos con los desarrolladores de FFmpeg, FFlabs y VideoLAN para desarrollar características en FFmpeg que nos permitieron desaprobar por completo nuestra escisión interna y esperar exclusivamente en la traducción enhiesto para nuestros casos de uso. Utilizando parches actualizados y refactorizaciones, hemos podido guatar dos vacíos importantes que anteriormente habíamos confiado en nuestra escisión interna para guatar: transcodificación de múltiples carriles y métricas de calidad en tiempo existente.
Creación de una transcodificación multicarril más apto para VOD y transmisión en vivo

Cuando un legatario carga un video a través de una de nuestras aplicaciones, generamos un conjunto de codificaciones para reconocer la reproducción de transmisión dinámica adaptativa a través de HTTP (DASH). La reproducción DASH permite que el reproductor de video de la aplicación elija dinámicamente una codificación basada en señales como las condiciones de la red. Estas codificaciones pueden distinguirse en resolución, códec, velocidad de fotogramas y nivel de calidad visual, pero se crean a partir de la misma codificación fuente y el reproductor puede cambiar entre ellas sin problemas en tiempo existente.
En un sistema muy simple, líneas de comando FFmpeg separadas pueden gestar las codificaciones para cada carril una por una en serie. Esto podría optimizarse ejecutando cada comando en paralelo, pero rápidamente se vuelve ineficiente conveniente al trabajo duplicado realizado por cada proceso.
Para solucionar este problema, se podrían gestar múltiples horizontes interiormente de una única ringlera de comando FFmpeg, decodificando los cuadros de un video una vez y enviándolos a la instancia del codificador de cada salida. Esto elimina una gran cantidad de gastos generales al deduplicar la decodificación de video y el tiempo de inicio del proceso en el que incurre cada ringlera de comando. Cedido que procesamos más de mil millones de cargas de videos diariamente, cada una de las cuales requiere múltiples ejecuciones de FFmpeg, las reducciones en el uso de enumeración por proceso generan ganancias de eficiencia significativas.
Nuestra escisión interna de FFmpeg proporcionó una optimización adicional a esto: codificación de video paralelizada. Si proporcionadamente los codificadores de video individuales a menudo tienen múltiples subprocesos internamente, las versiones anteriores de FFmpeg ejecutaban cada codificador en serie para un cuadro determinado cuando se usaban varios codificadores. Al ejecutar todas las instancias del codificador en paralelo, se puede obtener un mejor paralelismo en genérico.
Gracias a las contribuciones de los desarrolladores de FFmpeg, incluidos los de FFlabs y VideoLAN, se implementaron subprocesos más eficientes a partir de FFmpeg 6.0, con los toques finales en 8.0. Esto estuvo directamente influenciado por el diseño de nuestra horquilla interna y fue una de las características principales que confiamos en ella. Este progreso condujo a la La refactorización más compleja de FFmpeg en décadas. y ha permitido codificaciones más eficientes para todos los usuarios de FFmpeg.
Para portar completamente desde nuestra escisión interna, necesitábamos una característica más implementada en sentido enhiesto: métricas de calidad en tiempo existente.
Facultad de métricas de calidad en tiempo existente durante la transcodificación para transmisiones en vivo

Las métricas de calidad visual, que brindan una representación numérica de la calidad visual percibida de los medios, se pueden utilizar para cuantificar la pérdida de calidad incurrida por la compresión. Estas métricas se clasifican como métricas de relato o sin relato, donde las primeras comparan una relato codificando a algún otro distorsionado codificación.
FFmpeg puede calcular varias métricas de calidad visual, como PSNR, SSIM y VMAF, utilizando dos codificaciones existentes en una ringlera de comando separada una vez finalizada la codificación. Esto está proporcionadamente para casos de uso fuera de ringlera o VOD, pero no para transmisión en vivo donde es posible que deseemos calcular métricas de calidad en tiempo existente.
Para hacer esto, necesitamos insertar un decodificador de video a posteriori de cada codificador de video utilizado por cada carril de salida. Estos proporcionan mapas de bits para cada fotograma del vídeo. a posteriori Se ha adaptado compresión para que podamos comparar con los fotogramas. antaño compresión. Al final, podemos producir una métrica de calidad para cada carril codificado en tiempo existente usando una única ringlera de comando FFmpeg.
Gracias a la decodificación «en caracolillo», que fue habilitada por los desarrolladores de FFmpeg, incluidos los de FFlabs y VideoLAN, a partir de FFmpeg 7.0, ya no tenemos que someterse de nuestra escisión interna de FFmpeg para esta capacidad.
Estamos en escalón upstream cuando tendrá el longevo impacto comunitario
Cosas como métricas de calidad en tiempo existente mientras se transcodifica y subprocesos más eficientes pueden gestar ganancias de eficiencia para una variedad de canalizaciones basadas en FFmpeg tanto interiormente como fuera de Meta, y nos esforzamos por permitir que estos desarrollos upstream beneficien a la comunidad FFmpeg y a la industria en genérico. Sin retención, hay algunos parches que hemos desarrollado internamente y no tiene sentido contribuir en forma previa. Estos son muy específicos de nuestra infraestructura y no se generalizan proporcionadamente.
FFmpeg admite decodificación, codificación y filtrado acelerados por hardware con dispositivos como NVDEC y NVENC de NVIDIA, Unified Video Decoder (UVD) de AMD y Quick Sync Video (QSV) de Intel. Cada dispositivo es compatible a través de una implementación de API normalizado en FFmpeg, lo que permite una integración más sencilla y minimiza la privación de indicadores de ringlera de comando específicos del dispositivo. Hemos anexo soporte para el Metaprocesador de vídeo escalable (MSVP)nuestro ASIC personalizado para transcodificación de video, a través de estas mismas API, lo que permite el uso de herramientas comunes en diferentes plataformas de hardware con peculiaridades mínimas específicas de la plataforma.
Como MSVP solo se usa interiormente de la propia infraestructura de Meta, crearía un desafío para los desarrolladores de FFmpeg admitirlo sin llegada al hardware para pruebas y potencia. En este caso, tiene sentido suministrar parches como este internos, ya que no proporcionarían ningún beneficio forastero. Hemos asumido la responsabilidad de cambiar la cojín de nuestros parches internos a versiones más recientes de FFmpeg a lo dilatado del tiempo, utilizando una potencia exhaustiva para asegurar la solidez y la corrección durante las actualizaciones.
Nuestro compromiso continuo con FFmpeg
Con una codificación de múltiples carriles más apto y métricas de calidad en tiempo existente, pudimos desaprobar por completo nuestra escisión FFmpeg interna para todos los canales de VOD y transmisión en vivo. Y gracias a las API de hardware estandarizadas en FFmpeg, hemos podido reconocer nuestro MSVP ASIC próximo con canalizaciones basadas en software con una fricción mínima.
FFmpeg ha resistido la prueba del tiempo con más de 25 primaveras de progreso activo. Los desarrollos que mejoran la utilización de bienes, agregan soporte para nuevos códecs y funciones y aumentan la confiabilidad permiten un soporte sólido para una abanico más amplia de medios. Para las personas en nuestras plataformas, esto significa permitir nuevas experiencias y mejorar la confiabilidad de las existentes. Planeamos continuar invirtiendo en FFmpeg en asociación con desarrolladores de código extenso, brindando beneficios a Meta, a la industria en genérico y a las personas que utilizan nuestros productos.
Expresiones de devolución
Nos gustaría devolver las contribuciones de la comunidad de código extenso, nuestros socios en FFlabs y VideoLAN, y muchos ingenieros de Meta, incluidos Max Bykov, Jordi Cenzano Ferret, Tim Harris, Colleen Henry, Mark Shwartzman, Haixia Shi, Cosmin Stejerean, Hassene Tmar y Victor Loh.