Cómo aceleramos ocho veces la codificación de vídeo

Cómo aceleramos ocho veces la codificación de vídeo

Cada día, millones de espectadores ven vídeos en Internet. Pero para que el vídeo esté disponible, no sólo debe cargarse en el servidor, sino también procesarse. Cuanto más rápido suceda esto, mejor para el servicio y sus usuarios.

Mi nombre es Askar Kamalov, hace un año me uní al equipo de tecnología de video de Yandex. Hoy les contaré brevemente a los lectores de Habr cómo, al paralelizar el proceso de codificación, logramos acelerar significativamente la entrega de video al usuario.

Esta publicación será de interés principalmente para aquellos que no hayan pensado antes en lo que sucede bajo el capó de los servicios de video. En los comentarios puedes hacer preguntas y sugerir temas para futuras publicaciones.

Algunas palabras sobre la tarea en sí. Yandex no sólo le ayuda a buscar vídeos en otros sitios, sino que también almacena vídeos para sus propios servicios. Ya sea un programa original o un partido deportivo al aire, una película en KinoPoisk o videos en Zen y News, todo esto se carga en nuestros servidores. Para que los usuarios puedan ver el video, es necesario prepararlo: convertirlo al formato requerido, crear una vista previa o incluso ejecutar la tecnología. ProfundoHD. Un archivo no preparado simplemente ocupa espacio. Además, no estamos hablando sólo del uso óptimo del hardware, sino también de la velocidad de entrega de contenidos a los usuarios. Ejemplo: se puede buscar una grabación del momento decisivo de un partido de hockey un minuto después del evento en sí.

Codificación secuencial

Por tanto, la felicidad del usuario depende en gran medida de la rapidez con la que el vídeo esté disponible. Y esto está determinado principalmente por la velocidad de transcodificación. Cuando no existen requisitos estrictos para la velocidad de carga de videos, entonces no hay problemas. Tomas un archivo único e indivisible, lo conviertes y lo subes. Al comienzo de nuestro viaje, así es como trabajamos:

Cómo aceleramos ocho veces la codificación de vídeo

El cliente carga el video en el almacenamiento, el componente Analizador recopila metainformación y transfiere el video al componente Trabajador para su conversión. Todas las etapas se realizan de forma secuencial. En este caso, puede haber muchos servidores de codificación, pero solo uno está ocupado procesando un vídeo específico. Diagrama simple y transparente. Aquí terminan sus ventajas. Este esquema sólo se puede escalar verticalmente (debido a la compra de servidores más potentes).

Codificación secuencial con resultado intermedio.

Para suavizar de alguna manera la dolorosa espera, la industria ideó una opción de codificación rápida. El nombre es engañoso porque, de hecho, la codificación completa se produce de forma secuencial y lleva el mismo tiempo. Pero con un resultado intermedio. La idea es la siguiente: preparar y publicar una versión del vídeo en baja resolución lo más rápido posible, y sólo después versiones de mayor resolución.

Por un lado, el vídeo está disponible más rápidamente. Y es útil para eventos importantes. Pero, por otro lado, la imagen resulta borrosa y esto molesta a los espectadores.

Resulta que no solo es necesario procesar rápidamente el video, sino también mantener su calidad. Esto es lo que los usuarios esperan ahora de un servicio de vídeo. Puede parecer que basta con comprar los servidores más productivos (y actualizarlos periódicamente todos a la vez). Pero esto es un callejón sin salida, porque siempre hay un vídeo que ralentizará incluso el hardware más potente.

Codificación paralela

Es mucho más eficiente dividir un problema complejo en muchos menos complejos y resolverlos en paralelo en diferentes servidores. Este es MapReduce para video. En este caso, no estamos limitados por el rendimiento de un servidor y podemos escalar horizontalmente (agregando nuevas máquinas).

Por cierto, la idea de dividir vídeos en trozos pequeños, procesarlos en paralelo y pegarlos no es ningún secreto. Puedes encontrar muchas referencias a este enfoque (por ejemplo, en Habré recomiendo una publicación sobre el proyecto DistVIDc). Pero esto no lo hace más fácil en general, porque no se puede simplemente tomar una solución ya preparada e incorporarla a su hogar. Necesitamos adaptación a nuestra infraestructura, a nuestro vídeo e incluso a nuestra carga. En general, es más fácil escribir el tuyo propio.

Entonces, en la nueva arquitectura, dividimos el bloque Worker monolítico con codificación secuencial en microservicios Segmenter, Tcoder, Combiner.

Cómo aceleramos ocho veces la codificación de vídeo

  1. Segmenter divide el vídeo en fragmentos de aproximadamente 10 segundos. Los fragmentos constan de uno o más GOP (grupo de fotos). Cada GOP es independiente y está codificado por separado para que pueda decodificarse sin referencia a fotogramas de otros GOP. Es decir, los fragmentos se pueden reproducir de forma independiente unos de otros. Esta fragmentación reduce la latencia, lo que permite que el procesamiento comience antes.
  2. Tcoder procesa cada fragmento. Toma una tarea de la cola, descarga un fragmento del almacenamiento, lo codifica en diferentes resoluciones (recuerde que el jugador puede elegir una versión según la velocidad de la conexión), luego devuelve el resultado al almacenamiento y marca el fragmento como procesado. en la base de datos. Una vez procesados ​​todos los fragmentos, Tcoder envía la tarea para generar resultados para el siguiente componente.
  3. Combiner recopila los resultados: descarga todos los fragmentos creados por Tcoder y genera transmisiones para diferentes resoluciones.

Algunas palabras sobre el sonido. El códec de audio AAC más popular tiene una característica desagradable. Si codifica fragmentos por separado, simplemente no podrá pegarlos sin problemas. Las transiciones se notarán. Los códecs de vídeo no tienen este problema. Teóricamente, puedes buscar una solución técnica compleja, pero este juego simplemente no vale la pena todavía (el audio pesa mucho menos que el video). Por lo tanto, solo se codifica el vídeo en paralelo y se procesa toda la pista de audio.

resultados

Gracias al procesamiento de video paralelo, hemos reducido significativamente el retraso entre que se carga un video y está disponible para los usuarios. Por ejemplo, antes se podían tardar dos horas en crear varias versiones completas de diferente calidad para una película FullHD de una hora y media de duración. Ahora todo esto lleva 15 minutos. Además, con el procesamiento paralelo, creamos una versión de alta resolución incluso más rápido que una versión de baja resolución con el antiguo enfoque de resultados intermedios.

Y una cosa más. Con el enfoque anterior, o no había suficientes servidores o estaban inactivos sin tareas. La codificación paralela permite aumentar la proporción de reciclaje de hierro. Ahora nuestro grupo de más de mil servidores siempre está ocupado con algo.

De hecho, todavía hay margen de mejora. Por ejemplo, podemos ahorrar un tiempo importante si empezamos a procesar fragmentos del vídeo antes de que nos llegue completo. Como dicen, más por venir.

Escriba en los comentarios sobre qué tareas en el campo del trabajo con videos le gustaría leer.

Enlaces útiles a la experiencia de colegas de la industria

Fuente: habr.com

Añadir un comentario