Plataforma de video propia o cómo tomar muchos recursos informáticos. Parte 1

En la foto, la primera bicicleta voladora de cuatro ruedas. Fuente

Hoy, debido a la disponibilidad de los servicios necesarios, publicar videos en la red no es una tarea difícil. Sin embargo, no hay tantos materiales sobre la estructura interna de tales sistemas, especialmente en el segmento de idioma ruso.

He estado involucrado en el diseño y desarrollo de una plataforma de video de alta calidad por algún tiempo. En este artículo quiero describir esos momentos que a mí mismo me gustaría conocer al comienzo del desarrollo.

El artículo no reclama el estado de liderazgo, en él trataré de describir solo puntos interesantes o no obvios que afectan el procesamiento y la entrega de contenido de video basado en HTML5.
El material está diseñado para aquellos que ya están en el tema, o está listo para buscar un desglose de abreviaturas, términos y conceptos.

La segunda parte

Formato


H264 High-profile, a pesar de su popularidad, resulta que no funciona en todas partes, algunos navegadores no incluyen su soporte. Afortunadamente, en dispositivos modernos, en casi todas partes donde no se admite H264, VP8 / 9 funciona. Es preferible usar VP9, ​​ya que No he visto versiones anteriores de decodificadores que puedan VP8, pero no VP9 o H264. VP9 ofrece una calidad de imagen comparable a H264 con una tasa de bits de ~ 30% menor; esto es importante para reducir la carga en los canales. Además, si el uso del códec MPEG puede tener reclamos legales (una historia muy complicada), entonces VP9 está bien con esto. Es cierto que la velocidad de codificación de VP9 es aproximadamente un orden de magnitud menor, por lo tanto, se deben asignar más recursos para su procesamiento.

Si es necesario admitir equipos antiguos que no pueden hacer frente a H264 High, puede agregar 480p H264 Main con una tasa de bits más baja como tercer formato.

Hi10P es enormemente mejor no usarlo debido a la mala compatibilidad de decodificación de hardware.
El H265 obviamente requerirá tarifas de licencia, lo cual no es para todos.

Suave vs duro


Los codificadores de hardware no utilizan la mayoría de las funciones avanzadas de los códecs (ahorrando espacio en chips), produciendo archivos codificados subóptimos. La elección del formato es limitada, no todos los parámetros de codificación se pueden configurar: a menudo, de los valores que realmente afectan el resultado, solo hay una tasa de bits, e incluso eso se percibe de manera muy peculiar. Si todo se hace como debería, entonces en chips normales puede obtener un resultado completamente sano con un lineal (efecto en escenas dinámicas) y una tasa de bits un poco más alta.

Y, por supuesto, para que el codificador de hardware funcione, necesita un dispositivo: una tarjeta de video o procesador con un núcleo de video, que no todos los servidores tienen.

Pero ellos son rápidos. Muy En comparación con el procesamiento de software, la velocidad puede crecer un par de cientos de veces, hasta un nivel en el que la E / S del disco puede no ser suficiente.

El procesamiento por métodos de hardware depende mucho del proveedor de la solución: cada proveedor tiene su propio conjunto de bibliotecas y utilidades para esto, y hay mucho para elegir: Intel Quick Sync, NVenc, AMD VCE.

Con el procesamiento de software, no existen tales restricciones, y con una tasa de bits equivalente, el resultado es mejor. Para trabajar con varios formatos y códecs hay ffmpeg; Los "apparatchiks" no tienen ese lujo (con reservas).

Criterios de calidad de video


Para determinar la calidad objetivo, es más fácil leer en bits por píxel, BPP. Esta configuración es independiente de la resolución, la velocidad de fotogramas y la duración. A partir de eso, considere la tasa de bits según la fórmula
BPP * Framerate * Width * Height 
Los mejores valores de BPP se eligen mejor mediante experimentos independientes para el video que planea procesar. Un buen valor inicial para H264 es de alrededor de 0.09 bps. Para códecs de alto rendimiento, como H265 y VP9, ​​este parámetro se puede reducir en proporción a la relación de compresión comparativa. Además, BPP se puede reducir ligeramente para video de alta resolución, ya que la eficacia de los códecs aumenta ligeramente con la resolución, pero para esta corrección debe tener en cuenta la resolución de la sección de codificación (cortes, una característica de los códecs que le permite codificar video con bloques de resolución fraccional semiindependiente).

Para la tasa de bits obtenida por la fórmula anterior, es aconsejable predeterminar los valores máximos en función de la velocidad de Internet esperada para el cliente: pocas personas se sentirán cómodas viendo un video de muy alta calidad, pero constantemente almacenado.

Es por eso que es inconveniente usar parámetros Q de códecs (loros de calidad): los valores fijos dan una tasa de bits final impredecible.

maxRate se hace mejor con un margen, porque los códecs pueden no mantener con precisión los valores requeridos, incluso con codificación de dos pasos.

Para mantener la calidad de las escenas dinámicas, es mejor habilitar el modo VBR de los códecs, sin embargo, minRate es mejor establecer al menos el 90% de la velocidad de bits total para que los picos de velocidad no conduzcan a la falta de memoria intermedia.

Las utilidades como Intel VPA, ffprobe y Python son útiles en el control de calidad. Usando este último, es conveniente hacer comparaciones de la fuente y el video convertido, leer métricas arbitrarias, como la desviación promedio de píxeles.

El cálculo de PSNR y SSIM en la práctica es extremadamente ineficiente debido a las optimizaciones psicovisuales, que se incluyen en los códecs de forma predeterminada. Si desea calcular estas métricas de manera más o menos adecuada, puede desactivar las optimizaciones a través de
 -tune [psnr|ssim] 
Sin embargo, el archivo final, por supuesto, será diferente del creado sin estas banderas.

Vista previa


El principal problema de generar imágenes en miniatura es una fuente difusa. La definición y búsqueda de imágenes claras es una tarea muy poco trivial y que requiere muchos recursos. Afortunadamente, la solución a este problema en la mayoría de los códecs se incluye en el proceso de codificación de video. Puede tomar el fotograma clave más cercano a una determinada posición; de todos los fotogramas que lo rodean, será el más claro. En ffmpeg, esto se puede hacer así:

 -ss [] -vf \"select='eq(pict_type,PICT_TYPE_I)'\" -vsync vfr 

Los codificadores estándar no se comprimen de la mejor manera, por lo que después de recibir la imagen, es mejor apretarla con algo como optipng, ahorrando un promedio de 500kB en las vistas previas de FHD.

Las imágenes de alta resolución se hacen mejor entrelazadas. Por lo tanto, aumentaremos ligeramente el tamaño (en un 5-10%), pero reduciremos considerablemente el tiempo de visualización en la página de carga.

El artículo ya ha resultado ser denso, y tengo dudas de que toda la información necesite ser empaquetada en un texto enorme. Si está interesado en continuar con este tema, escriba los comentarios o marque en la encuesta.

La plataforma está cerrada, pero puedes ver su trabajo aquí .

* No tengo ninguna relación con los autores de los sitios respectivos y no puedo compartir sus puntos de vista y opiniones. No puedo comentar sobre las decisiones sobre quién y cómo se otorga el acceso al código.

Listo para responder preguntas.

Source: https://habr.com/ru/post/es436568/


All Articles