¿Qué significan todas estas abreviaturas? ¿Qué se necesita para desarrollar un reproductor de código abierto para ver videos de Amazon, Sky y otras plataformas y ver videos de cualquier proveedor? Sebastian Golasch habló sobre cómo se lleva a cabo el proceso de transmisión de video en la conferencia HolyJS 2018 Piter. Bajo el corte - video y traducción de su informe.
Sebastian Golasch es actualmente desarrollador en Deutsche Telekom. Trabajó con Java y PHP durante mucho tiempo, y luego cambió a JS, Python y Rust. Durante los últimos siete años, ha estado trabajando en la plataforma patentada de la casa inteligente Qivicon.Un poco sobre la historia de la transmisión de video
Primero, veamos la historia de la web, ya que hemos pasado de QuickTime a Netflix en 25 años. Todo comenzó en los años 90 cuando Apple inventó QuickTime. Su uso en Internet comenzó en 1993-1994. En ese momento, el reproductor podía reproducir video con una resolución de 156 × 116 píxeles y una frecuencia de 10 FPS, sin aceleración de hardware (utilizando solo recursos del procesador). Este formato se centró en una conexión de acceso telefónico de 9600 baudios: 9600 bps, incluida información general.
Era la época del navegador Netscape. El video en el navegador no se veía muy bien, porque no era nativo de la web. Para la reproducción, utilizamos software externo (el mismo QuickTime) con su propia interfaz, que se visualizó en el navegador utilizando la etiqueta de inserción.

La situación mejoró un poco cuando Macromedia lanzó Shockwave Player (después de la adquisición de Macromedia por Adobe, se hizo conocido como Adobe Flash Player). La primera versión de Shockwave Player se lanzó en 1997, pero la reproducción de video apareció solo en 2002.
Utilizaron el códec Sorenson Spark, también conocido como H.263. Se ha optimizado para resoluciones pequeñas y tamaños de archivo pequeños. ¿Qué significa esto? Por ejemplo, un video de 43 segundos que se usó para probar el Shockwave Player pesaba solo 560 KB. Por supuesto, no sería muy agradable ver una película con esta calidad, pero la tecnología en sí era interesante para ese momento. Sin embargo, como en el caso de QuickTime, para que Shockwave Player funcionara en el navegador, se requería software adicional. Este reproductor tenía muchos problemas de seguridad, pero lo más importante es que el video seguía siendo un complemento del navegador.
En 2007, Microsoft lanzó Silverlight, que recuerda un poco a Flash. No profundizaremos, pero todas estas soluciones tenían algo en común: una caja negra. Todos los jugadores funcionaban como un complemento de navegador, y no tenías idea de lo que estaba sucediendo dentro.

Elemento < Video/
>
En 2007, Opera propuso usar la etiqueta <
Video/
>, es decir, hacer videos nativos en un navegador. Lo usamos hoy. Es fácil y conveniente, y cualquier video no solo se puede ver, sino también descargar. E incluso si no queremos permitir la descarga de videos, no podemos prohibir la descarga al navegador. Lo máximo es hacer que la descarga del video sea más difícil.

La
<Video/>
es exactamente lo contrario del cuadro negro, y ver el código fuente es muy simple.

DRM
Sin embargo, no puede hacer clic derecho en un video en Netflix y seleccionar "Guardar como". La razón de esto es DRM (Gestión de restricciones digitales). Esta no es una sola tecnología o una sola aplicación que realiza cualquier tarea. Este es un término general para conceptos tales como:
- Autenticación y cifrado de usuario
- Cifrado basado en contenido
- Definición de derechos y aplicación de restricciones.
- Comentarios y actualización
- Control de salida y protección de enlace
- Examen y seguimiento de intrusos.
- Gestión de claves y licencias.
Para comprender qué es DRM, necesitamos estudiar su ecosistema, es decir, determinar qué compañías están involucradas. Esto es:
- Los propietarios de contenido están en la cima del ecosistema. Por ejemplo, Disney, MGM o FIFA. Estas empresas producen contenido y tienen derechos sobre él.
- Los núcleos DRM son compañías que proporcionan tecnología DRM (por ejemplo, Google, Apple, Microsoft, etc.). Actualmente, existen entre 7 y 8 tecnologías DRM de diferentes compañías.
- Proveedores de servicios : desarrolle un software de servidor que codifique el video.
- Navegadores que en realidad son jugadores.
- Los proveedores de contenido son empresas como Netflix, Amazon, Sky, etc. Por regla general, no poseen los derechos sobre el contenido, lo licencian y lo distribuyen.
- Los proveedores de chips / dispositivos también están involucrados en el ecosistema, porque DRM no es solo tecnología de software. Algunas compañías (principalmente chinas) están desarrollando chips que codifican y decodifican video.
¿Alguna vez se ha preguntado por qué cuando ve un video en Netflix en un navegador no tiene una resolución muy alta (SD), pero si ve el mismo video en un Apple TV o Android TV Box, el mismo contenido se reproduce en Full HD o en 4K? DRM también es responsable de esto. El hecho es que los fabricantes siempre temen que los piratas roben contenido. Por lo tanto, cuanto menos seguro sea el entorno en el que se realiza la decodificación de video, peor calidad se mostrará al usuario. Por ejemplo, si la decodificación se realiza mediante programación (por ejemplo, en Chrome o Firefox), el video se muestra con la peor calidad. En un entorno donde se utilizan capacidades de hardware para la decodificación (por ejemplo, si Android usa una GPU), las posibilidades de copia ilegal de contenido son menores, y aquí la calidad de reproducción es mayor. Finalmente, el entorno más seguro es completamente hardware (Apple TV o Android TV Box), donde la decodificación y reproducción se realizan sin involucrar al software.

Pero si hablamos de navegadores, la decodificación en ellos casi siempre se realiza mediante software. Diferentes navegadores usan diferentes sistemas para DRM. Chrome y Firefox usan Widevine. Esta empresa es propiedad de Google y licencia sus aplicaciones DRM. Por lo tanto, para la decodificación, Firefox descarga la biblioteca DRM de Google. En el navegador puede ver de dónde proviene la descarga.

Apple usa su propio sistema FairPlay, que fue creado cuando la compañía presentó el primer iPhone y iPad. Microsoft también usa su propio desarrollo llamado PlayReady, que está integrado en Windows. En otros casos, Widevine se usa con mayor frecuencia. Este sistema existe tanto como una aplicación como una solución de hardware: chips que decodifican video.
Cdm
La abreviatura CDM significa Módulo de descifrado de contenido. Esta es una pieza de software o hardware que puede funcionar de varias maneras:
- Descifre el video, después de lo cual se representa en el navegador con la etiqueta <Video />.
- Descifre y decodifique el video, y luego transfiera los cuadros sin procesar del video para su reproducción al navegador.
- Descifre y decodifique el video y luego transfiera los cuadros sin formato del video para reproducirlos con la GPU.
A pesar del soporte de la GPU, la segunda opción se usa con mayor frecuencia (al menos cuando se trata de Chrome y Firefox).
Decodificación y decodificación de capas en el navegador
Entonces, ¿cómo funciona todo junto? Para comprender esto, mire las capas de decodificación y descifrado en el navegador. Se dividen en:
- Aplicación JavaScript: le dice a la computadora qué video voy a ver.
- Un navegador es un reproductor que reproduce contenido de video.
- Módulo de descifrado de contenido.
- La gestión de derechos digitales tiene que ver con la decodificación de video (no pude encontrar una notación mejor, así que lo llamé así).
- Tiempo de ejecución confiable.
- En este caso, los dos primeros componentes son un reproductor DRM, el módulo de descifrado de contenido es un cliente DRM y los dos últimos componentes son el núcleo DRM.

Lo que sucede cuando reproduce un video en un navegador se muestra en la imagen a continuación. Ella, por supuesto, es un poco confusa: hay muchas flechas y colores. Lo examinaré paso a paso, utilizando casos reales para aclararlo.

Usaremos Netflix como ejemplo. Escribí una aplicación de depuración.
Comencé con dónde, creo, cada uno de ustedes comenzaría: miré las solicitudes que hace Netflix cuando comienzo un video, y vi una gran cantidad de registros.

Sin embargo, si deja solo los que realmente se necesitan para reproducir el video, resulta que solo hay tres de ellos: manifiesto, licencia y el primer fragmento del video.

El reproductor de Netflix está escrito en JavaScript y contiene más de 76,000 líneas de código, y, por supuesto, no puedo analizarlo por completo. Pero me gustaría mostrar las partes principales que son necesarias para reproducir videos protegidos.
Comenzaremos con la plantilla:

EME
Pero antes de profundizar en las funciones, debemos familiarizarnos con otra tecnología: EME (Extensiones de medios cifrados, extensiones de medios cifrados). Esta tecnología no realiza descifrado y decodificación, es solo una API de navegador. EME sirve como interfaz para CDM, para KeySystem, para un servidor con licencia y para un servidor donde se almacena el contenido.
Entonces, comencemos con getKeySystemConfig.

Debe tenerse en cuenta que depende del proveedor, por lo que la configuración que presento aquí funciona para Netflix, pero no funciona, por ejemplo, para Amazon.
En esta configuración, debemos decirle al sistema de fondo qué nivel de tiempo de ejecución confiable podemos ofrecer. Esto puede ser una decodificación de hardware segura o una decodificación de software segura. Es decir, le estamos diciendo al sistema qué hardware y software se utilizará para la reproducción. Y eso determinará la calidad del contenido.

Después de config config, mira crear un MediaKeySystem inicial.

Aquí es donde comienza la interacción con el módulo de descifrado de contenido. Debe informar a la API qué sistema DRM y KeySystem utilizamos. En nuestro caso, esto es Widevine.

El siguiente paso es opcional para todos los sistemas, pero es necesario para Netflix. Nuevamente, su necesidad depende del proveedor. Necesitamos aplicar un certificado de servidor a nuestras mediaKeys. Los certificados de servidor son texto sin formato en un archivo Netflix Cadmium.js que se puede copiar fácilmente. Y cuando lo aplicamos a mediaKeys, toda comunicación entre el servidor con la licencia y nuestro navegador se vuelve segura gracias al uso de este certificado.

Cuando se hace esto, debemos recurrir al elemento original del video y decir: “Ok, este es el sistema clave que queremos usar, y esta es la etiqueta de video hola. Déjanos unirte.

Y aquí está la última función que necesita para configurar el sistema de video.

Esta es una sesión DRM, o MediaKeySession. Estos son solo los datos que van del proveedor al módulo de descifrado que firma las solicitudes con ellos. Estos datos también son texto sin formato, que está oculto detrás de varias funciones en el archivo del reproductor de Netflix, desde donde los copié.

Cuando llamamos a create.Session en el objeto mediaKeys, necesitamos decir qué video admitimos. En este caso, es mp4. Esto nos devuelve al contexto de mensajería con nuestro sistema CDM. También necesitamos que Netflix aplique el certificado del servidor base64 en cada formulario, pero toda esta configuración en la sesión de creación se proporciona nuevamente dependiendo del sistema DRM.

La última función aquí abajo: keySession.generateRequest crea una solicitud de licencia en segundo plano. O CDM está creando una solicitud de licencia en segundo plano. En otras palabras, se trata de datos binarios sin formato que debemos enviar al servidor con licencia para obtener una licencia válida a cambio.

Aquí cenc es de interés. Es un estándar de encriptación ISO que define un esquema de seguridad para video mp4. En WebM, esto se llama de manera diferente, pero la función realiza lo mismo.
handleMessage es la interfaz EventListener que configuramos. Cuando el evento de mensaje genera un evento en keySession, sabemos que estamos listos para obtener una licencia del servidor.

Y en esta devolución de llamada solo recibimos una solicitud a un servidor con una licencia que proporciona algunos datos binarios (también pueden diferir según el proveedor). Utilizamos estos datos para actualizar la sesión actual agregando una licencia. Es decir, tan pronto como recibimos una licencia válida del servidor, nuestro CDM sabe que podemos decodificar y descifrar el video.

Si aplicamos esto al siguiente diagrama, obtenemos esto: queremos reproducir el video, y la aplicación de JavaScript dice: “¡Hola, navegador! ¡Quiero reproducir el video! " - luego utiliza Extensiones de medios cifrados y realiza una solicitud de Licencia de funciones en Widevine CDM para obtener una licencia. Luego, esta solicitud se devuelve al navegador, y podemos cambiarla por una licencia válida en el servidor de licencias, y luego debemos transferir esta licencia nuevamente a CDM. Este proceso se mostró en el código anterior.

Pero tenga en cuenta que aún no hemos perdido un segundo del video, y todos tenemos que hacer esto para poder reproducir algunos videos en el futuro.
MSE
Y otra tecnología que necesitamos investigar es MSE (Media Source Extensions). Puede llamarse la media hermana de EME (Extensiones de medios cifrados). Esta también es una API de navegador, y no tiene nada que ver con DRM. Lo veo como una interfaz de programación para <
Video/
> Src. Utilizándolo, puede crear flujos binarios en JavaScript y aplicar fragmentos de video al elemento <
Video/
>. Por lo tanto, gracias a ello, la fuente de la etiqueta <
Video/
> se vuelve dinámica.
Entonces, podemos usar las extensiones para fuentes multimedia, instanciar y acceder al video, y luego descargar los fragmentos de video en partes y aplicarlos a la etiqueta <
Video/
>.

El punto es que cuando ves un video de dos horas, no quieres esperar hasta que esté completamente cargado. En cambio, lo corta en trozos pequeños que varían en tamaño desde aproximadamente 30 segundos a 2 minutos y los aplica al elemento <
Video/
> uno a la vez.
Una vez que nuestro búfer MediaSource esté listo y vinculado al elemento <
Video/
>, podemos agregar un SourceBuffer. Debemos decirle nuevamente qué formato de video y qué códecs usamos, y luego se creará.

Finalmente, ahora podemos obtener fragmentos individuales y enviarlos en nuestro SourceBuffer utilizando el método de agregar al elemento <Video />, recibiendo un video creado dinámicamente. También se puede usar para otros casos de uso en los que las personas pueden combinar de forma independiente diferentes elementos del video, creando sus propios videos, pero no me gustaría profundizar demasiado en él.

Así que este es casi el último paso que debemos dar. Tiene una red de distribución, tiene fragmentos y luego el navegador envía los fragmentos cifrados y comprimidos al CDM, donde se realiza el descifrado y, posiblemente, la decodificación. Luego, los fragmentos descifrados y sin comprimir se envían de vuelta al navegador, donde se visualizan y muestran.

Manifiesto
Pero hay un punto más. ¿Cómo sabemos qué fragmentos necesitamos descargar, de dónde descargarlos y cuándo? Y esta es la última parte, la solicitud que falta del manifiesto. Cuando consultamos Netflix para un manifiesto, necesita muchos datos. Si solo queremos reproducir un video, nos importa qué sistema DRM usamos, qué video queremos ver (Netflix ID, que se puede copiar desde la URL) y los perfiles. Los perfiles determinan en qué resolución recibimos el video, y también en qué idioma recibimos las pistas de audio, en qué formato (estéreo, Dolby Digital, etc.), si usamos subtítulos, etc.

MPEG-DASH
El formato de manifiesto más utilizado es MPEG-DASH. Es cierto que Apple usa un formato diferente: HSL, que en apariencia se asemeja a una lista de archivos en el viejo reproductor Winamp. Pero Widevine y Microsoft usan exactamente MPEG-DASH. Se basa en XML y define todo: duración, tamaño del búfer, tipos de contenido, cuándo se cargan los fragmentos, fragmentos para diferentes resoluciones, así como el cambio de velocidad de bits adaptable. Esto último significa que si un usuario, por ejemplo, mira un video y, al mismo tiempo, la velocidad de descarga disminuye, la reproducción no se detiene, pero la calidad del video simplemente se deteriora. Esto se debe al hecho de que el manifiesto define las mismas partes para diferentes resoluciones, tienen la misma duración y los mismos índices. Por lo tanto, si la velocidad de descarga disminuye, el navegador simplemente puede cambiar a una transmisión con una resolución más baja sin pausar la descarga y sin almacenar en búfer los datos.
Así es como se ve el manifiesto para Guardianes de la Galaxia. En él podemos ver que a diferentes velocidades de descarga, las personas recibirán videos con diferente calidad, así como el hecho de que hay pistas de audio para personas con discapacidad auditiva. También detalla los subtítulos.

Tenemos una duración y una indicación del tiempo desde el cual comenzar la reproducción. Esta función se usa, por ejemplo, cuando interrumpe la visualización y luego vuelve al video nuevamente, comenzando desde donde lo dejó.

También hay robustez nuevamente, que dice: este fragmento solo se puede perder si su sistema cumple con los requisitos. En este caso, se trata de decodificación de hardware: códecs seguros de hardware.

Para la misma parte del video, puede determinar cualquier cantidad de fragmentos con diferentes resoluciones.

Y luego obtienes la URL para cargar el fragmento, y el parámetro de rango muestra el rango de valores en milisegundos.

Esta es la última parte. A veces también obtienes un manifiesto de la CDN. Algunos proveedores tienen un servidor separado para la entrega de fragmentos, pero la mayoría de las veces provienen de la misma máquina que la funcionalidad de manifiesto. Cuando descargamos el manifiesto, sabemos qué fragmentos necesitamos descargar, podemos enviar una solicitud de fragmentos y luego descifrar y decodificar desde CDM.

En general, eso es todo. Todo lo dicho anteriormente es suficiente para desarrollar un reproductor de código abierto para ver videos de Amazon, Sky y otras plataformas y ver videos de casi cualquier proveedor.
Msl
Netflix consideró que valía la pena agregar un cifrado de mensaje adicional entre el navegador y el servidor. Lo llamaron la "capa de seguridad de mensajes", la capa de seguridad de mensajes o MSL. No hace nada directamente con el video, es solo una capa adicional de cifrado. Una de las razones para implementar MSL es que HTTPS no es lo suficientemente seguro.
MSL , por otro lado, es de código abierto, por lo que siempre puede ver cómo funciona. Aquí no voy a profundizar en este tema, y si está interesado, siempre puede encontrar información sobre por qué Netflix hace MSL en su blog. GitHub tiene documentación detallada sobre su implementación e implementaciones de trabajo en Java.
También hay una
implementación de Python que escribimos con amigos. Hasta donde sé, este es el único cliente de código abierto que funciona para Netflix. Trabaja con Kodi Media Center. Para la visualización, puede usar VLC Player o cualquier otro software adecuado.
Y de nuevo la "caja negra"
Entonces, viste lo que necesitábamos para implementar todo esto, y con qué frecuencia mencioné CDM: el "recuadro negro" que se descarga de Google. Por lo tanto, de nuevo devolvimos el video a la "caja negra". El hermoso elemento <Video /> está nuevamente oculto para nosotros. Hemos agregado software de terceros que nos ayuda, pero que al mismo tiempo está cerrado y que no podemos administrar. Puede hacer muchas cosas discretas: seguimiento, análisis, envío de datos ...

Esto es lo que Tim Berners Lee dijo sobre esto:
"Entonces, en general, es importante mantener EME como un entorno en línea relativamente seguro donde se pueden ver películas, así como el más conveniente y que lo hace parte del discurso interconectado de la humanidad".Pero hay otras opiniones al respecto. En particular, de la Electronic Frontiers Foundation, que antes del advenimiento de DRM era miembro del W3C. Esto es lo que dicen:
“En 2013, EFF se decepcionó al saber que el W3C se hizo cargo del proyecto de estandarización de EME: extensiones de medios cifrados. De hecho, estamos hablando de una API cuya única función era proporcionar a DRM un papel de liderazgo en el ecosistema del navegador. Continuaremos luchando para garantizar que Internet sea gratuito y abierto. "Continuaremos demandando al gobierno de los Estados Unidos para derogar las leyes que hacen que la GRD sea tan tóxica, y continuaremos luchando al nivel de la ley global".Es difícil para mí decir cómo relacionarme con esto. , , , . , Netflix, . , , .
, 24-25 , HolyJS 2018 Moscow , «The Universal Serial Web» : WebUSB, USB- . -, .
PS 1- . , — 50% .