Cómo aceleramos la codificación de video ocho veces



Todos los días, millones de espectadores ven videos en Internet. Pero para que el video esté disponible, no solo debe cargarse en el servidor, sino también procesarse. Cuanto más rápido suceda esto, mejor será el servicio y sus usuarios.

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

Esta publicación será principalmente de interés para aquellos que no han pensado previamente en lo que está sucediendo bajo el capó de los servicios de video. En los comentarios, puede hacer preguntas y sugerir temas para publicaciones futuras.

Algunas palabras sobre la tarea en sí. Yandex no solo ayuda a buscar videos en otros sitios, sino que también almacena videos para sus propios servicios. Ya sea un programa de autor o un partido deportivo en Ether, una película en KinoPoisk o videos en Zen y News, todo esto se carga en nuestros servidores. Para que los usuarios vean un video, debe estar preparado: convertirlo al formato requerido, crear una vista previa o incluso conducirlo a través de la tecnología DeepHD . Un archivo no preparado solo ocupa espacio. Y estamos hablando no solo del uso óptimo del hierro, sino también de la velocidad de entrega de contenido a los usuarios. Ejemplo: se puede buscar un registro con el momento decisivo de un partido de hockey en la búsqueda dentro de un minuto después del evento en sí.

Codificación secuencial


Por lo tanto, la felicidad del usuario depende en gran medida de qué tan rápido esté disponible el video. Y esto está determinado principalmente por la velocidad de transcodificación. Cuando no hay requisitos estrictos para la velocidad de carga de video, entonces no hay problemas. Tome un solo archivo indivisible, conviértalo, cárguelo. Al comienzo de nuestro viaje, trabajamos así:



el cliente carga el video en el repositorio, el componente Analizador recopila metainformación y transfiere el video para su conversión al componente Trabajador. Todos los pasos se realizan secuencialmente. Al mismo tiempo, puede haber muchos servidores para codificar, pero solo uno está ocupado procesando un video específico. Diseño simple y transparente. Aquí es donde terminan sus méritos. Tal esquema se escala solo verticalmente (debido a la compra de servidores más potentes).

Codificación secuencial con resultado intermedio


Para suavizar de alguna manera la dolorosa expectativa, la industria ideó una opción de codificación rápida. Este es un nombre engañoso, porque de hecho, la codificación completa se lleva a cabo secuencialmente y durante tanto tiempo. Pero con un resultado intermedio. La idea es esta: prepare y cargue la versión de baja resolución del video lo antes posible, y solo más tarde, versiones de mayor resolución.

Por un lado, el video se está volviendo más rápido. Y es útil para eventos importantes. Pero por otro lado, la imagen es borrosa, y esto molesta a la audiencia.

Resulta que no solo necesita procesar rápidamente el video, sino también preservar su calidad. Esto es lo que los usuarios esperan ahora de un servicio de video. Puede parecer que es suficiente comprar los servidores más productivos (y actualizarlos regularmente de una vez). Pero este es un camino a un callejón sin salida, porque siempre hay un video que ralentizará incluso el hardware más potente.

Codificación paralela


Es mucho más eficiente dividir una tarea difícil en muchas menos complejas y simultáneamente resolverlas en diferentes servidores. Tal es MapReduce para video. En este caso, no descansamos en el rendimiento de un solo servidor y podemos escalar horizontalmente (agregando nuevas máquinas).

Por cierto, la idea de dividir un video en pedazos pequeños, procesarlos y pegarlos simultáneamente no es un secreto. Puede encontrar muchas referencias a este enfoque (por ejemplo, en Habré recomiendo una publicación sobre el proyecto DistVIDc ). Pero esto generalmente no lo hace más fácil, porque no puede simplemente tomar una solución preparada y construirla en usted mismo. Necesitamos adaptarnos a nuestra infraestructura, nuestro video e incluso nuestra carga de trabajo. En general, es más fácil escribir el tuyo.

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



  1. El segmentador divide el video en fragmentos en aproximadamente 10 segundos. Los fragmentos consisten en uno o más GOP ( grupo de imágenes ). Cada GOP es independiente y se codifica por separado, de modo que se puede decodificar sin referencia a cuadros de otros GOP. Es decir, los fragmentos se pueden reproducir independientemente uno del otro. Esta segmentación reduce la latencia, lo que le permite comenzar a procesar antes.
  2. Tcoder . , , (, , ), . , Tcoder .
  3. ombiner : , Tcoder, .

Algunas palabras sobre el sonido. El códec de audio AAC más popular tiene una característica desagradable. Si codifica los fragmentos por separado, pegarlos sin problemas simplemente no funcionará. Las transiciones serán notables. Los códecs de video no tienen ese problema. Teóricamente, puedes buscar una solución técnica difícil, pero este juego simplemente no vale la pena (el audio pesa significativamente menos que el video). Por lo tanto, solo el video se codifica en paralelo con nosotros, y la pista de audio se procesa como un todo.

resultados


Gracias al procesamiento de video paralelo, redujimos significativamente el retraso entre la descarga de un video para nosotros y su disponibilidad para los usuarios. Por ejemplo, antes podría llevar dos horas crear varias versiones completas de diferente calidad para una película FullHD que dure una hora y media. Ahora todo lleva 15 minutos. Además, en el procesamiento paralelo, creamos una versión de alta resolución incluso más rápida que una versión de baja resolución con el enfoque anterior con un resultado intermedio.

Y algo más. Con el enfoque anterior, podrían faltar servidores o estar inactivos sin tareas. La codificación paralela puede aumentar la proporción de utilización de hierro. Ahora nuestro clúster de más de mil servidores siempre está ocupado con algo.

De hecho, todavía hay margen de mejora. Por ejemplo, podemos ahorrar mucho tiempo si comenzamos a procesar fragmentos de un video incluso antes de que llegue por completo. Como dicen, más allá, más.

Escriba en los comentarios sobre qué tareas en el campo de trabajar con video le gustaría leer.

Enlaces útiles a pares de la industria



All Articles