Está en la página 1de 3

HLS REPRODUCIR TUTORIAL

toptal.com/Apple/introduction-to-http-live-streaming-hls
La transmisión de video es una parte integral de la experiencia moderna de Internet. Está en todas partes: en teléfonos móviles, computadoras de escritorio, televisores e
incluso dispositivos portátiles. Debe funcionar sin problemas en cada dispositivo y tipo de red, ya sea en conexiones móviles lentas, WiFi, detrás de firewalls, etc. El HTTP
Live Streaming (HLS) de Apple se creó exactamente con estos desafíos en mente.
Casi todos los dispositivos modernos están equipados con hardware moderno que es lo suficientemente rápido como para reproducir video, por lo que la velocidad y la
confiabilidad de la red surgen como el mayor problema. ¿Por qué es eso? Hasta hace unos años, la forma canónica de almacenar y publicar videos eran protocolos
basados en UDP como RTP. Esto resultó problemático en muchos sentidos, para enumerar solo algunos:
1. Necesita un servicio de servidor (daemon) para transmitir contenido. 2. La mayoría de los firewalls están configurados para permitir solo puertos estándar y tipos de
tráfico de red, como http, correo electrónico, etc. 3. Si su audiencia es global, necesita una copia de su servicio de transmisión de demonios que se ejecuta en todas las
regiones principales. Por supuesto, puede pensar que todos estos problemas son fáciles de resolver. Simplemente almacene archivos de video (por ejemplo, archivos
mp4) en su servidor http y use su servicio CDN favorito para servirlos en cualquier parte del mundo.
Donde el streaming de video heredado se queda corto
Esto está lejos de ser la mejor solución por algunas razones, siendo la eficiencia una de ellas. Si almacena archivos de video originales en resolución completa, los usuarios
en áreas rurales o partes del mundo con poca conectividad tendrán dificultades para disfrutarlos. Sus reproductores de video tendrán dificultades para descargar
suficientes datos para reproducirlos en tiempo de ejecución.
Por lo tanto, necesita una versión especial del archivo para que la cantidad de video descargado sea aproximadamente la misma que se puede reproducir. Por ejemplo,
si la resolución y la calidad del video son tales que en cinco segundos puede descargar otros cinco segundos de video, eso es óptimo. Sin embargo, si toma cinco
segundos, descargue solo tres segundos de video, el reproductor se detendrá y esperará a que se descargue la siguiente parte de la transmisión. Por otro lado, reducir
aún más la calidad y la resolución solo degradaría la experiencia del usuario en conexiones más rápidas, ya que estaría ahorrando innecesariamente el ancho de banda.
Sin embargo, hay una tercera vía.
Transmisión de velocidad de bits adaptativa
Si bien puede cargar diferentes versiones de video para diferentes usuarios, debe tener la capacidad de controlar a sus jugadores y calcular cuál es la mejor transmisión
para su conexión y dispositivo. Luego, el reproductor necesita cambiar entre ellos (por ejemplo, cuando un usuario cambia de 3G a WiFi). E incluso entonces, ¿qué pasa
si el cliente cambia el tipo de red? Luego, el reproductor debe cambiar a un video diferente, pero debe comenzar a reproducirse desde el principio, sino en algún lugar
en el medio del video. Entonces, ¿cómo se calcula el rango de bytes para solicitar? Una cosa genial sería si los reproductores de video pudieran detectar cambios en el
tipo de red y el ancho de banda disponible, y luego cambiar de forma transparente entre diferentes transmisiones (del mismo video preparado para diferentes
velocidades) hasta que encuentre la mejor. Eso es exactamente lo que resuelve la transmisión de velocidad de adaptative bitrate.
¿Qué es el HLS?
HTTP Live Streaming es un protocolo de transmisión de velocidad de bits adaptable introducido por Apple en 2009. Utiliza archivos m3u8 para describir las transmisiones
multimedia y utiliza HTTP para la comunicación entre el servidor y el cliente. Es el protocolo de transmisión de medios predeterminado para todos los dispositivos iOS, pero
se puede usar en Android y navegadores web.

Los bloques de construcción básicos de secuencia HLS son: 1. Listas de reproducción M3U8 2. Archivos multimedia para varias transmisiones M3U8 Playlists.
¿Qué son los archivos M3U8?
M3U (o M3U8) es un formato de archivo de texto sin formato creado originalmente para organizar colecciones de archivos MP3. El formato se extiende para HLS, donde
se usa para definir flujos de medios. En HLS hay dos tipos de archivos m3u8:
• Lista de reproducción multimedia: contiene las URL de los archivos necesarios para la transmisión (es decir, fragmentos del video original que se reproducirá). • Lista de
reproducción maestra: contiene URL a listas de reproducción de medios que, a su vez, contienen variantes del mismo video preparado para diferente ancho banda. URL
transmisión archivos M3U8, ejemplo: https://s3-us-west-2.amazonaws.com/hls-playground/hls.m3u8
Archivo M3U8 de muestra para HLS Stream
Un archivo M3U8 contiene lista direcciones URL o rutas archivos locales con algunos metadatos adicionales. Las líneas de metadatos comienzan con #.
Este ejemplo ilustra cómo se ve un archivo M3U8 para una secuencia HLS simple:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:11
#EXTINF:5.215111,
00000.ts
#EXTINF:10.344822,
00001.ts
#EXTINF:10.344822,
00004.ts
#EXT-X-ENDLIST
• Las primeras cuatro líneas son metadatos globales (encabezado) para esta lista de reproducción M3U8.
• La VERSIÓN EXT-X es la versión del formato M3U8 (debe ser al menos 3 si queremos usar entradas EXTINF).
• La etiqueta EXT-X-TARGETDURATION contiene la duración máxima de cada "fragmento" de video. Por lo general, este valor es de alrededor de 10 s.
• El resto del documento contiene pares de líneas como:
#EXTINF:10.344822,
00001.ts
Este es un "fragmento" de video. Este representa el fragmento 00001.ts que tiene exactamente 10.344822 segundos de duración. Cuando un reproductor de video cliente
necesita iniciar un video desde un cierto punto en dicho video, puede calcular fácilmente qué archivo .ts necesita solicitar sumando las duraciones de los fragmentos
vistos anteriormente. La segunda línea puede ser un nombre de archivo local o una URL a ese archivo. El archivo M3U8 con sus archivos .ts representa la forma más simple
de una transmisión HLS: una lista de reproducción de medios. Puedes abrir un ejemplo simple aquí. Tenga en cuenta que no todos los navegadores pueden reproducir
transmisiones HLS de forma predeterminada.
Lista de reproducción maestra o archivo Index M3U8
El ejemplo anterior de M3U8 apunta a una serie de fragmentos .ts. Se crean a partir del archivo de video original, que se redimensiona codificado y se divide en fragmentos.
Eso significa que todavía tenemos el problema descrito en la introducción: ¿qué pasa con los clientes en redes muy lentas (o inusualmente rápidas)? ¿O clientes en redes
rápidas con tamaños de pantalla muy pequeños? No tiene sentido transmitir un archivo en resolución máxima si no se puede mostrar en todo su esplendor en su nuevo
y brillante teléfono.

HLS resuelve este problema introduciendo otra "capa" de M3U8. Este archivo M3U8 no contendrá punteros a archivos .ts, pero tiene punteros a otros archivos M3U8 que,
a su vez, contienen archivos de video preparados de antemano para tasas de bits y resoluciones específicas.
Aquí hay un ejemplo de tal archivo M3U8:
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1296,RESOLUTION=640x360
https://.../640x360_1200.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=264,RESOLUTION=416x234
https://.../416x234_200.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1628,RESOLUTION=960x540
https://.../960x540_1500.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2628,RESOLUTION=1280x720
https://.../1280x720_2500.m3u8
El reproductor de video elegirá pares de líneas como:
#EXT-X-STREAM-INF:BANDWIDTH=1296,RESOLUTION=640x360
https://.../640x360_1200.m3u8
Estas se denominan variantes del mismo video preparado para diferentes velocidades de red y resoluciones de pantalla. Este archivo M3U8 específico
(640x360_1200.m3u8) contiene los fragmentos de archivo de video redimensionados a 640x360 píxeles y preparados para velocidades de bits de 1296 kbps. Tenga en
cuenta que la tasa de bits informada debe tener en cuenta las transmisiones de video y audio en el video.
El reproductor de video generalmente comenzará a reproducirse desde la primera variante de transmisión (en el ejemplo anterior, esto es 640x360_1200.m3u8). Por esa
razón, debe tener cuidado para decidir qué variante será la primera en la lista. El orden de variantes no es importante.
Si el primer archivo .ts tarda demasiado en descargarse (provocando un "almacenamiento en búfer", es decir, esperando el próximo fragmento), el reproductor de video
cambiará a una transmisión con una tasa de bits menor. Y, por supuesto, si se carga lo suficientemente rápido, significa que puede cambiar a una variante de mejor
calidad, pero solo si tiene sentido para la resolución de la pantalla.
Si la primera transmisión en la lista del índice M3U8 no es la mejor, el cliente necesitará uno o dos ciclos hasta que se resuelva con la variante correcta.
Entonces, ahora tenemos tres capas de HLS:
1. Indexe el archivo M3U8 (la lista de reproducción maestra) que contiene punteros (URL) a variantes.
2. Variantes de archivos M3U8 (la lista de reproducción de medios) para diferentes transmisiones para diferentes tamaños de pantalla y velocidades de red. Contienen
punteros (URL) a archivos .ts.
3. archivos .ts (fragmentos) que son archivos binarios con partes del video.
Puede ver un archivo de índice M3U8 de ejemplo aquí (de nuevo, depende de su navegador / SO).
A veces, sabe de antemano que el cliente está en una red lenta o rápida. En ese caso, puede ayudar al cliente a elegir la variante correcta proporcionando un archivo
índice M3U8 con una primera variante diferente. Hay dos formas de hacer esto.
• El primero es tener múltiples archivos de índice preparados para diferentes tipos de red y preparar al cliente con anticipación para solicitar el correcto. El cliente tendrá
que verificar el tipo de red y luego solicitar, por ejemplo, http: //.../index_wifi.m3u8 o http: //.../index_mobile.m3u8.
• También puede asegurarse de que el cliente envíe el tipo de red como parte de la solicitud http (por ejemplo, si está conectado a un wifi o móvil 2G / 3G / ...) y luego
tener el archivo índice M3U8 preparado dinámicamente para cada solicitud. Solo el archivo índice M3U8 necesita una versión dinámica, las secuencias individuales
(archivos M3U8 variantes) aún pueden almacenarse como archivos estáticos.
Preparación de archivos de video para HLS
Hay dos componentes básicos importantes de la transmisión en vivo HTTP de Apple. Una es la forma en que se almacenan los archivos de video (para ser servidos a través
de HTTP más adelante) y la otra son los archivos de índice M3U8 que le dicen al reproductor (la aplicación cliente de transmisión) dónde obtener qué archivo de video.
Comencemos con los archivos de video. El protocolo HLS espera que los archivos de video se almacenen en fragmentos más pequeños de igual longitud, típicamente
10 segundos cada uno. Originalmente, esos archivos tenían que almacenarse en archivos MPEG-2 TS (.ts) y codificarse con el formato H.264 con audio en MP3, HE-AAC
o AC-3.

Eso significa que un video de 30 segundos se dividirá en 3 archivos .ts más pequeños, cada uno de aproximadamente 10 segundos de duración. Tenga en cuenta que
la última versión de HLS también permite archivos .mp4 fragmentados. Dado que esto todavía es algo nuevo, y algunos reproductores aún necesitan implementarlo, los
ejemplos en este artículo usarán archivos .ts.
Keyframes
Los fragmentos deben codificarse con un fotograma clave al comienzo de cada archivo. Cada video contiene marcos. Los marcos son imágenes, pero los formatos de
video no almacenan imágenes completas, eso ocuparía demasiado espacio en disco. Codifican solo la diferencia del cuadro anterior. Cuando saltas a un punto medio
en el video, el reproductor necesita un "punto de partida" desde donde aplicar todos esos diferenciales para mostrar la imagen inicial y luego comenzar a reproducir el
video.
Es por eso que los fragmentos .ts deben tener un fotograma clave al comienzo. Algunas veces los jugadores necesitan comenzar en el medio de la porción. El jugador
siempre puede calcular la imagen actual agregando "diffs" de primer fotograma clave. Pero, si comienza 9 segundos desde comienzo, necesita calcular 9 segundos de
"diffs". Para hacer que el cálculo rápido, es mejor crear fotogramas clave en pocos segundos (mejor cca 3s).
HLS Break Points
Hay situaciones en las que desea que se reproduzcan varios videoclips en sucesión. Una forma de hacerlo es fusionar los archivos de video originales y luego crear las
transmisiones HLS con ese archivo, pero eso es problemático por varias razones. ¿Qué sucede si desea mostrar un anuncio antes o después de su video? Tal vez no desee
hacer eso para todos los usuarios, y probablemente desee diferentes anuncios para diferentes usuarios. Y, por supuesto, no desea preparar archivos HLS con diferentes
anuncios por adelantado.
Para solucionar ese problema, hay una etiqueta # EXT-X-DISCONTINUITY que se puede usar en la lista de reproducción m3u8. Esta línea básicamente le dice al reproductor
de video que se prepare con anticipación para el hecho de que, a partir de este momento, los archivos .ts pueden crearse con una configuración diferente (por ejemplo,
la resolución puede cambiar). El jugador necesitará recalcular todo y posiblemente cambiar a otra variante y debe estar preparado para tales puntos de "discontinuidad".
Live Streaming With HLS
Básicamente hay dos tipos de "transmisión de video". Uno es Video On Demand (VOD) para videos grabados por adelantado y transmitidos al usuario cuando él lo
decida. Y hay transmisión en vivo. Aunque HLS es una abreviatura de HTTP Live Streaming, todo lo explicado hasta ahora se ha centrado en VOD, pero también hay una
manera de hacer transmisión en vivo con HLS.
Hay algunos cambios en sus archivos M3U8. Primero, debe haber una etiqueta # EXT-X-MEDIA-SEQUENCE: 1 en la variante del archivo M3U8. Luego, el archivo M3U8 no
debe terminar con # EXT-X-ENDLIST (que de lo contrario siempre debe colocarse al final).
Mientras graba su transmisión, tendrá constantemente nuevos archivos .ts. Debe agregarlos a la lista de reproducción M3U8 y cada vez que agregue uno nuevo, el
contador en # EXT-X-MEDIA-SEQUENCE: <counter> debe incrementarse en 1.
El reproductor de video revisará el contador. Si se modificó desde la última vez, sabe si hay nuevos fragmentos para descargar y reproducir. Asegúrese de que el archivo
M3U8 se sirva con los encabezados sin caché, porque los clientes seguirán recargando los archivos M3U8 esperando que se reproduzcan nuevos fragmentos.
VTT
Otra característica interesante para las transmisiones HLS es que puede incrustar archivos Web Video Text Track (VTT) en ellas. Los archivos VTT pueden usarse para varios
usos. Por ejemplo, para un reproductor web HLS, puede especificar instantáneas de imágenes para varias partes del video. Cuando el usuario mueve el mouse sobre el
área del temporizador de video (debajo del reproductor de video), el jugador puede mostrar instantáneas desde esa posición en el video. Otro uso obvio para los
archivos VTT son los subtítulos. La secuencia HLS puede especificar múltiples subtítulos para múltiples idiomas:
# EXT-X-MEDIA: TYPE = SUBTITLES, GROUP-ID = "subs", NAME = "English", DEFAULT = YES, AUTOSELECT = YES, FORCED = NO, LANGUAGE = "en", CHARACTERISTICS =
"public.accessibility. diálogo de transcripción hablada, public.accessibility.describes-music-and-sound ", URI =" subtitles / eng / prog_index.m3u8 "
Entonces, theprog_index.m3u8 se ve así:
#EXTM3U
#EXT-X-TARGETDURATION:30
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:30,
0000.webvtt
#EXTINF:30,
0001.webvtt
...
El VTT real (por ejemplo 0000.webvtt):
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:900000,LOCAL:00:00:00.000
00:00:01.000 --> 00:00:03.000
Subtitle -Unforced- (00:00:01.000)
00:00:03.000 --> 00:00:05.000
<i>...text here... -Unforced- (00:00:03.000)</i>
<i>...text here...</i>
Además de los archivos VTT, Apple anunció recientemente que HLS contará con soporte para IMSC1, un nuevo formato de subtítulos optimizado para la entrega de
transmisión. Su ventaja más importante es que se puede diseñar usando CSS.
Herramientas de transmisión en vivo de HTTP y posibles problemas
Apple introdujo una serie de herramientas útiles de HSL, que se describen con mayor detalle en la guía oficial de HLS.
• Para transmisiones en vivo, Apple preparó una herramienta llamada mediastreamsegmenter para crear archivos de segmento sobre la marcha desde una transmisión
de video en curso.
• Otra herramienta importante es mediastreamvalidator. Verificará sus listas de reproducción M3U8, descargará los archivos de video e informará sobre varios problemas.
Por ejemplo, cuando la tasa de bits informada no es la misma que la calculada a partir de los archivos .ts.
• Por supuesto, cuando debe codificar / decodificar / mux / demux / chunk / strip / merge / join / ... video / audio files, hay ffmpeg. Esté preparado para compilar sus
propias versiones personalizadas de ffmpeg para casos de uso específicos.
Uno de los problemas más frecuentes encontrados en el video es la sincronización de audio. Si encuentra que el audio en algunas de sus transmisiones HLS no está
sincronizado con el video (es decir, un actor abre la boca, pero nota que la voz es de unos pocos milisegundos antes o después), es posible que se haya filmado el
archivo de video original usando un framerate variable. Asegúrese de convertirlo a velocidad de bits constante.
Si es posible, es aún mejor asegurarse de que su software esté configurado para grabar video a una velocidad de fotogramas constante.
HTTP Live Streaming Example
He preparado una aplicación HLS para Android que transmite un HLS predefinido utilizando el reproductor ExoPlayer de Google. Mostrará un video y una lista de "eventos"
de HLS debajo de él. Esos eventos incluyen: cada archivo .ts descargado, o cada vez que el jugador decide cambiar a un flujo de bitrate más alto o más bajo.
Veamos las partes principales de la inicialización del visor. En el primer paso recuperaremos el tipo de conexión actual del dispositivo y utilizaremos esa información para
decidir qué archivo m3u8 recuperar.
String m3u8File = "hls.m3u8";
ConnectivityManager connectivity = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = connectivity.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.isConnectedOrConnecting()) {
int type = activeNetwork.getType();
int subType = activeNetwork.getSubtype();
if (type == ConnectivityManager.TYPE_MOBILE && subType == TelephonyManager.NETWORK_TYPE_GPRS) {
m3u8File = "hls_gprs.m3u8";
}
}
String m3u8URL = "https://s3-us-west-2.amazonaws.com/hls-playground/" + m3u8File;
Tenga en cuenta que esto no es estrictamente necesario. El reproductor HLS siempre se ajustará a la variante HLS correcta después de algunos fragmentos, pero eso
significa que en los primeros 5-20 segundos el usuario podría no ver la variante ideal de la transmisión.
Recuerde, la primera variante en el archivo m3u8 es con la que comenzará el visor. Dado que estamos en el lado del cliente y podemos detectar el tipo de conexión, al
menos podemos intentar evitar el cambio inicial del jugador entre las variantes solicitando el archivo m3u8 que se prepara de antemano para este tipo de conexión.
En el siguiente paso, inicializamos e iniciamos nuestro reproductor HLS:
Handler mainHandler = new Handler();
DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder()
.setEventListener(mainHandler, bandwidthMeterEventListener)
.build();
TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
TrackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
LoadControl = new DefaultLoadControl();
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
Then we prepare the player and feed it with the right m3u8 for this network connection type:
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "example-hls-app"), bandwidthMeter);
HlsMediaSource videoSource = new HlsMediaSource(Uri.parse(m3u8URL), dataSourceFactory, 5, mainHandler, eventListener);
player.prepare(videoSource);
Y aquí está el resultado:

Compatibilidad del navegador HLS, desarrollos futuros


Apple exige que las aplicaciones de transmisión de video en iOS tengan que usar HLS si los videos duran más de 10 minutos o más de 5 Mb. Eso en sí mismo es una garantía
de que HLS llegó para quedarse. Hubo algunas preocupaciones sobre HLS y MPEG-DASH y cuál será el ganador en el campo de los navegadores web. HLS no se
implementa en todos los navegadores modernos (probablemente haya notado que si hizo clic en los ejemplos de url m3u8 anteriores). En Android, por ejemplo, en
versiones anteriores a la 4.0 no funcionará en absoluto. De 4.1 a 4.4 funciona solo parcialmente (por ejemplo, falta el audio o falta el video, pero el audio funciona). Apple
anunció que el nuevo protocolo HLS permitirá archivos mp4 fragmentados (fMP4). Anteriormente, si deseaba tener compatibilidad con HLS y MPEG-DASH, tenía que
codificar sus videos dos veces. Ahora podrá reutilizar los mismos archivos de video y volver a empaquetar solo los archivos de metadatos (.m3u8 para HLS y .mpd para
MPEG-DASH). La situación actual en el mundo de los navegadores es que solo algunas implementaciones de navegador de la etiqueta <video> reproducirán HLS de
forma inmediata. Pero hay soluciones de código abierto y comerciales que ofrecen compatibilidad HLS. La mayoría de ellos ofrecen HLS al tener un respaldo de Flash,
pero hay algunas implementaciones completamente escritas en JavaScript.
Comprender los conceptos básicos. ¿Qué es un archivo M3U8? El M3U (o M3U8) es un formato de archivo de texto sin formato creado originalmente para organizar
colecciones de archivos MP3. El formato se extiende para HLS, donde se usa para definir flujos de medios. ¿Qué es el HLS? HTTP Live Streaming (HLS) es un protocolo de
transmisión de velocidad de bits adaptable introducido por Apple en 2009. Utiliza archivos m3u8 para describir las transmisiones multimedia y HTTP para la comunicación
entre el servidor y el cliente. Es el protocolo de transmisión de medios predeterminado para todos los dispositivos iOS. ¿Qué es MPEG-DASH? MPEG-DASH es una solución
de transmisión ampliamente utilizada, construida alrededor de HTTP al igual que Apple HLS. DASH significa Dynamic Adaptive Streaming sobre HTTP. ¿Qué navegador es
compatible con HLS? En los últimos años, el soporte HLS se ha agregado a la mayoría de los navegadores. Sin embargo, las diferencias persisten. Por ejemplo, Chrome y
Firefox presentan solo soporte parcial en plataformas de escritorio.

También podría gustarte