Dynamic Adaptive Streaming over HTTP (DASH) es un estándar internacional de transmisión multimedia adaptativa, desarrollado por MPEG (Moving Picture Experts Group). DASH entrega video y audio a través de HTTP utilizando una descripción XML del flujo en formato Media Presentation Description (MPD) y divide el contenido en segmentos de diferentes tasas de bits. Según el Bitmovin Video Developer Report (2025), el 58% de los desarrolladores de video utilizan DASH, lo que lo convierte en el segundo protocolo más popular después de HLS.
Puntos clave
MPEG-DASH (Dynamic Adaptive Streaming over HTTP) es un estándar internacional ISO/IEC 23009-1, publicado en 2012 como respuesta a la fragmentación de las soluciones propietarias de streaming adaptativo. A diferencia de HLS (protocolo propietario de Apple) y Smooth Streaming (Microsoft), DASH fue desarrollado desde el principio como un estándar abierto e independiente de proveedor, lo que garantizó su amplia adopción en la industria.
La principal innovación de DASH es la separación de la descripción del flujo y el contenido multimedia. La descripción del flujo se almacena en un archivo XML llamado MPD (Media Presentation Description), que contiene toda la información sobre las opciones disponibles: tasas de bits, resoluciones, códecs, subtítulos, pistas de audio. El contenido multimedia se almacena en segmentos independientes (generalmente fMP4), que se pueden cargar de forma independiente a través de HTTP. Esta arquitectura permite que la infraestructura del servidor sea lo más simple posible — cualquier servidor HTTP puede servir contenido DASH.
La adaptabilidad en DASH se implementa mediante la multiplexación de variantes de contenido. El servidor prepara varias representaciones — copias del contenido con diferentes parámetros de compresión. El cliente analiza el ancho de banda del canal y cambia dinámicamente entre representaciones, eligiendo el equilibrio óptimo entre calidad y estabilidad de reproducción. Según un estudio académico (IEEE Access, 2024), DASH con el algoritmo BOLA muestra un 22% menos de cambios de tasa de bits en comparación con HLS en conexiones inestables.
MPEG comenzó a trabajar en DASH en 2010 después de analizar las soluciones existentes: Apple HLS, Microsoft Smooth Streaming y Adobe HDS. La primera versión del estándar (ISO/IEC 23009-1:2012) se publicó en 2012. La segunda versión (2014) agregó soporte para eventos, inserción de anuncios mejorada y adaptación controlada por el servidor. La tercera versión (2019) añadió soporte para HDR, 8K, video háptico y una mejor integración con MMT (MPEG Media Transport) para redes 5G.
En 2024, MPEG anunció DASH Next Generation, que incluye soporte para códecs de redes neuronales, renderizado en la nube y optimización para escenarios de Realidad Extendida (XR). Una innovación clave es la codificación de video basada en redes neuronales (NNVC), que utiliza modelos de ML para la decodificación del lado del cliente, lo que potencialmente reduce la tasa de bits en un 30-50% manteniendo la calidad.
El proceso de reproducción de un flujo DASH consta de cuatro etapas secuenciales: obtención del MPD, análisis de la descripción del flujo, selección de la representación inicial y conmutación dinámica entre representaciones. Cada etapa tiene sus particularidades que afectan la calidad de la experiencia del usuario.
El reproductor carga el archivo MPD desde una URL conocida. El MPD contiene una estructura XML que describe todo el flujo: duración del contenido, línea de tiempo, periodos disponibles (Period), conjuntos de adaptación (AdaptationSet) y representaciones (Representation) con parámetros de codificación específicos. El reproductor analiza el MPD y crea un modelo interno de los recursos multimedia disponibles.
Ejemplo de un archivo MPD básico para contenido VOD con dos resoluciones:
<?xml version="1.0" encoding="utf-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
profiles="urn:mpeg:dash:profile:isoff-live:2011"
type="static"
mediaPresentationDuration="PT1H30M">
<Period duration="PT1H30M">
<AdaptationSet mimeType="video/mp4">
<Representation bandwidth="5000000"
width="1920" height="1080"
codecs="avc1.640028"/>
<Representation bandwidth="1000000"
width="640" height="360"
codecs="avc1.64001E"/>
</AdaptationSet>
</Period>
</MPD>
Después de seleccionar la representación inicial, el reproductor comienza a cargar segmentos. Cada segmento contiene varios segundos de contenido (generalmente 2-10 segundos). El reproductor mantiene un búfer de varios segmentos por adelantado, lo que garantiza resistencia a caídas breves de velocidad de la red. El algoritmo ABR (Adaptive Bitrate) monitorea constantemente la velocidad de descarga de segmentos y decide cambiar entre las tasas de bits disponibles.
Los algoritmos ABR modernos para DASH, como BOLA (Buffer Occupancy based Lyapunov Algorithm) y Pensieve (basado en Reinforcement Learning), tienen en cuenta no solo el ancho de banda actual sino también el tamaño del búfer, el tipo de contenido (deportes, noticias, cine) e incluso el consumo de energía del dispositivo. BOLA, que forma parte de dash.js y ExoPlayer, minimiza la cantidad de cambios de tasa de bits mientras mantiene un búfer estable, como lo confirma la investigación de ACM (Spiteri et al., 2020).
La estructura jerárquica de un flujo DASH está organizada en cuatro niveles: MPD → Period → AdaptationSet → Representation. Cada nivel agrega una capa de detalle, permitiendo describir escenarios complejos — desde VOD simple hasta transmisiones en vivo con inserciones de anuncios y video multiángulo.
MPD es el elemento raíz que describe toda la presentación multimedia. Los atributos de MPD definen el tipo de flujo (static para VOD, dynamic para live), la duración total, la línea de tiempo, el perfil y la información de DRM. El MPD puede contener uno o varios Periods, cada uno representando un segmento de tiempo independiente del contenido.
Period es un segmento temporal de la presentación. Para VOD, se utiliza un solo Period para todo el contenido. Para live con pausas publicitarias, el Period puede cambiar dinámicamente — el reproductor carga el MPD actualizado y detecta un nuevo Period correspondiente al bloque de anuncios. Cada Period contiene uno o más AdaptationSets.
AdaptationSet es un grupo de representaciones intercambiables de un tipo de medio: video, audio, subtítulos. Dentro de un AdaptationSet, todas las representaciones difieren solo en tasa de bits y/o resolución, pero codifican el mismo contenido. Una propiedad importante: el reproductor puede cambiar entre representaciones dentro del mismo AdaptationSet en los límites de los segmentos sin interrupción de la reproducción.
Representation es una variante de codificación específica con una tasa de bits, resolución y códec definidos. Para cada Representation, el MPD especifica una plantilla de URL para cargar segmentos. DASH utiliza un sistema flexible de direccionamiento de segmentos — mediante plantillas de URL con sustitución de número de segmento y tiempo ($Number$, $Time$), lo que permite al servidor generar nombres de archivo dinámicamente sin tener que enumerar cada segmento en el MPD.
Los segmentos en DASH pueden ser de dos tipos: tipo Segment (contienen solo datos multimedia) y tipo Subsegment (parte de un segmento para acceso más granular). Para codificar contenido DASH se utilizan herramientas como FFmpeg o codificadores por lotes. Ejemplo de creación de un flujo DASH a partir de un archivo de entrada:
import subprocess
subprocess.run([
"ffmpeg",
"-i", "input.mp4",
"-filter_complex",
"[0:v]split=2[v1][v2];[v1]scale=1920:1080[v1out];[v2]scale=640:360[v2out]",
"-map", "[v1out]", "-b:v:0", "5000k",
"-map", "[v2out]", "-b:v:1", "1000k",
"-map", "0:a",
"-f", "dash",
"-seg_duration", "4",
"-use_template", "1",
"-use_timeline", "1",
"dash/stream.mpd"
])
La elección entre DASH y HLS es una de las decisiones clave al diseñar un sistema de streaming de video. Ambos protocolos resuelven el mismo problema (entrega adaptativa de video por HTTP), pero tienen diferencias fundamentales en arquitectura, soporte de códecs y ecosistema. Examinémoslos por parámetros clave.
| Parámetro | DASH | HLS |
|---|---|---|
| Estándar | Internacional (ISO/IEC 23009-1) | Propietario (RFC 8216, Apple) |
| Descripción del flujo | XML (MPD) | Lista de reproducción M3U8 |
| Códecs | Cualquiera (H.264, HEVC, AV1, VP9) | Limitado (H.264, HEVC, AV1 desde 2023) |
| Formato de segmentos | fMP4 (principal), MPEG-2 TS | MPEG-2 TS, fMP4 |
| DRM | CENC (unificado para todos los DRM) | FairPlay, Widevine (por separado) |
| Soporte iOS | Mediante reproductores de terceros | Nativo (AVPlayer, Safari) |
| Navegadores | Chrome, Firefox, Edge (mediante MSE) | Safari (nativo), otros mediante MSE |
Ventaja clave de DASH — independencia de códecs. Mientras que HLS originalmente limitaba los códecs a los compatibles con Apple (H.264, HEVC y recientemente AV1), DASH puede usar cualquier códec compatible con el reproductor: VP9/VP8 (crítico para YouTube y Chrome), AV1 (para eficiencia), H.264/HEVC (para compatibilidad). Esto hace que DASH sea la opción preferida para servicios multiplataforma que requieren un flujo unificado para todos los dispositivos.
Desventaja de DASH en iOS — falta de soporte nativo en Safari y AVPlayer. Los desarrolladores de iOS necesitan usar reproductores compatibles con HLS de terceros o bibliotecas como libdash con integración mediante VTDecoder. En la práctica, esto significa que para proyectos centrados en iOS, HLS sigue siendo el estándar de facto, mientras que para Android y plataformas web, DASH es una solución más flexible y potente.
La integración de DASH en aplicaciones móviles depende de la plataforma. En Android, DASH es compatible directamente a través de ExoPlayer con el módulo de extensión. En iOS, se requieren bibliotecas de terceros como libdash con integración mediante AVFoundation o MPEGDASHPlayer. Veamos la implementación práctica para ambas plataformas.
ExoPlayer de Google proporciona soporte integrado para DASH a través del módulo `exoplayer-dash`. Conectar un flujo DASH no es diferente de otros formatos — basta con pasar la URI del archivo MPD en un MediaItem. ExoPlayer detecta automáticamente el formato del contenido e inicia el renderizador correspondiente, admitiendo todos los algoritmos ABR estándar.
val player = ExoPlayer.Builder(this).build()
val dashMediaItem = MediaItem
.Builder()
.setUri("https://example.com/dash/stream.mpd")
.setMimeType("application/dash+xml")
.build()
player.setMediaItem(dashMediaItem)
player.prepare()
player.playWhenReady = true
Common Encryption (CENC) es una de las características clave de DASH, que permite usar un solo flujo de medios con diferentes sistemas DRM. El archivo MPD contiene elementos XML ContentProtection con identificadores de sistemas DRM (Widevine, PlayReady, FairPlay). El cliente selecciona el sistema DRM adecuado según su plataforma y solicita una licencia al servidor de licencias.
val drmLicenseUri = Uri.parse("https://license.example.com/wv")
val drmSessionManager = DefaultDrmSessionManager
.Builder()
.setUuidAndExoMediaDrmProvider(
C.WIDEVINE_UUID,
FrameworkMediaDrm.DEFAULT_PROVIDER
)
.build(drmLicenseUri, null)
val mediaItem = MediaItem
.Builder()
.setUri("https://example.com/encrypted/stream.mpd")
.setDrmConfiguration(
MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri("https://license.example.com/wv")
.build()
)
.build()
Las aplicaciones móviles requieren una configuración especial de DASH debido a las limitaciones de ancho de banda y consumo de energía. Las recomendaciones clave incluyen: establecer un búfer mínimo de 2-3 segmentos para resistencia a caídas breves de velocidad, usar segmentos de 2-4 segundos para una respuesta más rápida a los cambios de red y precargar el siguiente segmento al cambiar de calidad.
Para ahorrar tráfico en redes móviles, Bitmovin (2024) recomienda usar Content Steering — un mecanismo similar a la función análoga de HLS, que permite dirigir dinámicamente al cliente al nodo CDN óptimo. DASH Content Steering se describe en la especificación ISO/IEC 23009-1:2022 y es compatible con dash.js 4.5+ y ExoPlayer 2.18+.
Preguntas frecuentes
DASH es un estándar internacional abierto de MPEG, no vinculado a ningún proveedor. A diferencia de HLS (protocolo propietario de Apple), DASH admite cualquier códec, utiliza descripción de flujo XML (MPD) en lugar de M3U8 y proporciona un sistema DRM unificado mediante CENC. HLS tiene soporte nativo en iOS, mientras que DASH es más flexible para soluciones multiplataforma.
En Android, el reproductor principal para DASH es ExoPlayer de Google con el módulo exoplayer-dash. En iOS, se utilizan soluciones de terceros como libdash con integración mediante AVFoundation o reproductores comerciales (THEOplayer, Bitmovin). En navegadores web, DASH se reproduce mediante dash.js usando MediaSource Extensions.
MPD (Media Presentation Description) es un archivo XML que describe la estructura del flujo DASH: duración del contenido, tasas de bits disponibles, resoluciones, códecs, formatos de segmentos y su ubicación. MPD sirve como punto de entrada para el reproductor, reemplazando la lista de reproducción maestra en HLS. Sin un archivo MPD, la reproducción de contenido DASH es imposible.
Sí, DASH admite tanto VOD como transmisiones en vivo. Para live se utiliza el tipo de MPD dynamic con actualización automática. El servidor actualiza periódicamente el MPD, agregando nuevos segmentos y eliminando los obsoletos. Low-Latency DASH (LL-DASH) con codificación fragmentada permite lograr una latencia de 3-8 segundos, comparable a LL-HLS.
DASH utiliza Common Encryption (CENC, ISO/IEC 23001-7), que permite cifrar el contenido multimedia una vez y descifrarlo con cualquier sistema DRM. El MPD contiene elementos XML ContentProtection con indicación de los DRM compatibles (Widevine, PlayReady, FairPlay). El reproductor selecciona el DRM adecuado según la plataforma y solicita una licencia a través de la URL especificada.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también