Dynamic Adaptive Streaming over HTTP (DASH) é um padrão internacional de transmissão multimídia adaptativa, desenvolvido pelo MPEG (Moving Picture Experts Group). O DASH entrega vídeo e áudio via HTTP usando uma descrição XML do fluxo no formato Media Presentation Description (MPD) e divide o conteúdo em segmentos de diferentes taxas de bits. De acordo com o Bitmovin Video Developer Report (2025), 58% dos desenvolvedores de vídeo usam DASH, tornando-o o segundo protocolo mais popular depois do HLS.
Pontos principais
MPEG-DASH (Dynamic Adaptive Streaming over HTTP) é um padrão internacional ISO/IEC 23009-1, publicado em 2012 como resposta à fragmentação das soluções proprietárias de streaming adaptativo. Ao contrário do HLS (protocolo proprietário da Apple) e do Smooth Streaming (Microsoft), o DASH foi desenvolvido desde o início como um padrão aberto e independente de fornecedor, o que garantiu seu amplo suporte na indústria.
A principal inovação do DASH é a separação da descrição do fluxo e do conteúdo multimídia. A descrição do fluxo é armazenada em um arquivo XML chamado MPD (Media Presentation Description), que contém todas as informações sobre as opções disponíveis: taxas de bits, resoluções, codecs, legendas, faixas de áudio. O conteúdo multimídia é armazenado em segmentos independentes (geralmente fMP4), que podem ser carregados independentemente via HTTP. Essa arquitetura permite que a infraestrutura do servidor seja a mais simples possível — qualquer servidor HTTP pode servir conteúdo DASH.
A adaptabilidade no DASH é implementada através da multiplexação de variantes de conteúdo. O servidor prepara várias Representations — cópias do conteúdo com diferentes parâmetros de compressão. O cliente analisa a largura de banda do canal e alterna dinamicamente entre as representações, escolhendo o equilíbrio ideal entre qualidade e estabilidade de reprodução. De acordo com um estudo acadêmico (IEEE Access, 2024), o DASH com o algoritmo BOLA mostra 22% menos trocas de taxa de bits em comparação com o HLS em conexões instáveis.
O MPEG começou a trabalhar no DASH em 2010 após analisar soluções existentes: Apple HLS, Microsoft Smooth Streaming e Adobe HDS. A primeira versão do padrão (ISO/IEC 23009-1:2012) foi publicada em 2012. A segunda versão (2014) adicionou suporte a eventos, inserção de anúncios aprimorada e adaptação controlada pelo servidor. A terceira versão (2019) adicionou suporte a HDR, 8K, vídeo háptico e melhor integração com MMT (MPEG Media Transport) para redes 5G.
Em 2024, o MPEG anunciou o DASH Next Generation, que inclui suporte a codecs de redes neurais, renderização em nuvem e otimização para cenários de Realidade Estendida (XR). Uma inovação chave é a Codificação de Vídeo Baseada em Redes Neurais (NNVC), que usa modelos de ML para decodificação no lado do cliente, potencialmente reduzindo a taxa de bits em 30-50% enquanto mantém a qualidade.
O processo de reprodução de um fluxo DASH consiste em quatro etapas sequenciais: obtenção do MPD, análise da descrição do fluxo, seleção da representação inicial e comutação dinâmica entre representações. Cada etapa tem suas especificidades que afetam a qualidade da experiência do usuário.
O player carrega o arquivo MPD de uma URL conhecida. O MPD contém uma estrutura XML que descreve todo o fluxo: duração do conteúdo, linha do tempo, períodos disponíveis (Period), conjuntos de adaptação (AdaptationSet) e representações (Representation) com parâmetros de codificação específicos. O player analisa o MPD e cria um modelo interno dos recursos multimídia disponíveis.
Exemplo de um arquivo MPD básico para conteúdo VOD com duas resoluções:
<?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>
Após selecionar a representação inicial, o player começa a carregar segmentos. Cada segmento contém vários segundos de conteúdo (geralmente 2-10 segundos). O player mantém um buffer de vários segmentos à frente, garantindo resiliência a quedas de curta duração na velocidade da rede. O algoritmo ABR (Adaptive Bitrate) monitora constantemente a velocidade de download dos segmentos e decide alternar entre as taxas de bits disponíveis.
Algoritmos ABR modernos para DASH, como BOLA (Buffer Occupancy based Lyapunov Algorithm) e Pensieve (baseado em Reinforcement Learning), consideram não apenas a largura de banda atual, mas também o tamanho do buffer, o tipo de conteúdo (esportes, notícias, filmes) e até o consumo de energia do dispositivo. O BOLA, que faz parte do dash.js e do ExoPlayer, minimiza o número de trocas de taxa de bits enquanto mantém um buffer estável, conforme confirmado pela pesquisa ACM (Spiteri et al., 2020).
A estrutura hierárquica de um fluxo DASH é organizada em quatro níveis: MPD → Period → AdaptationSet → Representation. Cada nível adiciona uma camada de detalhes, permitindo descrever cenários complexos — desde VOD simples até transmissões ao vivo com inserções de anúncios e vídeo multiângulo.
MPD é o elemento raiz que descreve toda a apresentação multimídia. Os atributos do MPD definem o tipo de fluxo (static para VOD, dynamic para live), duração total, linha do tempo, perfil e informações de DRM. O MPD pode conter um ou mais Periods, cada um representando um segmento de tempo independente do conteúdo.
Period é um segmento temporal da apresentação. Para VOD, um único Period é usado para todo o conteúdo. Para live com pausas publicitárias, o Period pode mudar dinamicamente — o player carrega o MPD atualizado e detecta um novo Period correspondente ao bloco de anúncios. Cada Period contém um ou mais AdaptationSets.
AdaptationSet é um grupo de representações intercambiáveis de um tipo de mídia: vídeo, áudio, legendas. Dentro de um AdaptationSet, todas as representações diferem apenas na taxa de bits e/ou resolução, mas codificam o mesmo conteúdo. Uma propriedade importante: o player pode alternar entre representações dentro do mesmo AdaptationSet nos limites dos segmentos sem interrupção da reprodução.
Representation é uma variante de codificação específica com uma taxa de bits, resolução e codec definidos. Para cada Representation, o MPD especifica um template de URL para carregar segmentos. O DASH usa um sistema flexível de endereçamento de segmentos — através de templates de URL com substituição de número de segmento e tempo ($Number$, $Time$), permitindo que o servidor gere nomes de arquivo dinamicamente sem precisar listar cada segmento no MPD.
Os segmentos no DASH podem ser de dois tipos: tipo Segment (contêm apenas dados de mídia) e tipo Subsegment (parte de um segmento para acesso mais granular). Para codificar conteúdo DASH, são usadas ferramentas como FFmpeg ou codificadores em lote. Exemplo de criação de um fluxo DASH a partir de um arquivo 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"
])
A escolha entre DASH e HLS é uma das decisões-chave ao projetar um sistema de streaming de vídeo. Ambos os protocolos resolvem o mesmo problema (entrega adaptativa de vídeo por HTTP), mas têm diferenças fundamentais na arquitetura, suporte a codecs e ecossistema. Vamos examiná-los por parâmetros-chave.
| Parâmetro | DASH | HLS |
|---|---|---|
| Padrão | Internacional (ISO/IEC 23009-1) | Proprietário (RFC 8216, Apple) |
| Descrição do fluxo | XML (MPD) | Lista de reprodução M3U8 |
| Codecs | Qualquer (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 os DRMs) | FairPlay, Widevine (separados) |
| Suporte iOS | Via players de terceiros | Nativo (AVPlayer, Safari) |
| Navegadores | Chrome, Firefox, Edge (via MSE) | Safari (nativo), outros via MSE |
Vantagem chave do DASH — independência de codecs. Enquanto o HLS originalmente limitava os codecs aos suportados pela Apple (H.264, HEVC e recentemente AV1), o DASH pode usar qualquer codec suportado pelo player: VP9/VP8 (crítico para YouTube e Chrome), AV1 (para eficiência), H.264/HEVC (para compatibilidade). Isso torna o DASH a escolha preferida para serviços multiplataforma que exigem um fluxo unificado para todos os dispositivos.
Desvantagem do DASH no iOS — falta de suporte nativo no Safari e AVPlayer. Desenvolvedores iOS precisam usar players compatíveis com HLS de terceiros ou bibliotecas como libdash com integração via VTDecoder. Na prática, isso significa que para projetos focados em iOS, o HLS continua sendo o padrão de fato, enquanto para Android e plataformas web, o DASH é uma solução mais flexível e poderosa.
A integração do DASH em aplicações móveis depende da plataforma. No Android, o DASH é suportado diretamente através do ExoPlayer com o módulo de extensão. No iOS, são necessárias bibliotecas de terceiros como libdash com integração via AVFoundation ou MPEGDASHPlayer. Vamos ver a implementação prática para ambas as plataformas.
O ExoPlayer do Google fornece suporte integrado para DASH através do módulo `exoplayer-dash`. Conectar um fluxo DASH não é diferente de outros formatos — basta passar a URI do arquivo MPD em um MediaItem. O ExoPlayer detecta automaticamente o formato do conteúdo e inicia o renderizador correspondente, suportando todos os algoritmos ABR padrão.
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) é um dos recursos-chave do DASH, permitindo usar um único fluxo de mídia com diferentes sistemas DRM. O arquivo MPD contém elementos XML ContentProtection com identificadores de sistemas DRM (Widevine, PlayReady, FairPlay). O cliente seleciona o sistema DRM apropriado com base em sua plataforma e solicita uma licença ao servidor de licenças.
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()
As aplicações móveis requerem uma configuração especial do DASH devido às limitações de largura de banda e consumo de energia. As principais recomendações incluem: definir um buffer mínimo de 2-3 segmentos para resiliência a quedas curtas de velocidade, usar segmentos de 2-4 segundos para resposta mais rápida a mudanças de rede e pré-carregar o próximo segmento ao alternar a qualidade.
Para economizar tráfego em redes móveis, a Bitmovin (2024) recomenda usar Content Steering — um mecanismo semelhante à função análoga do HLS, que permite direcionar dinamicamente o cliente para o nó CDN ideal. O DASH Content Steering é descrito na especificação ISO/IEC 23009-1:2022 e é suportado no dash.js 4.5+ e ExoPlayer 2.18+.
Perguntas frequentes
DASH é um padrão internacional aberto do MPEG, não vinculado a nenhum fornecedor. Ao contrário do HLS (protocolo proprietário da Apple), o DASH suporta qualquer codec, usa descrição de fluxo XML (MPD) em vez de M3U8 e fornece um sistema DRM unificado através do CENC. O HLS tem suporte nativo no iOS, enquanto o DASH é mais flexível para soluções multiplataforma.
No Android, o principal player para DASH é o ExoPlayer do Google com o módulo exoplayer-dash. No iOS, são usadas soluções de terceiros como libdash com integração via AVFoundation ou players comerciais (THEOplayer, Bitmovin). Em navegadores web, o DASH é reproduzido via dash.js usando MediaSource Extensions.
MPD (Media Presentation Description) é um arquivo XML que descreve a estrutura do fluxo DASH: duração do conteúdo, taxas de bits disponíveis, resoluções, codecs, formatos de segmentos e suas localizações. O MPD serve como ponto de entrada para o player, substituindo a playlist mestre no HLS. Sem um arquivo MPD, a reprodução de conteúdo DASH é impossível.
Sim, o DASH suporta tanto VOD quanto transmissões ao vivo. Para live, é usado o tipo de MPD dynamic com atualização automática. O servidor atualiza periodicamente o MPD, adicionando novos segmentos e removendo os obsoletos. O Low-Latency DASH (LL-DASH) com codificação fragmentada permite alcançar uma latência de 3-8 segundos, comparável ao LL-HLS.
DASH usa Common Encryption (CENC, ISO/IEC 23001-7), que permite criptografar o conteúdo multimídia uma vez e descriptografá-lo com qualquer sistema DRM. O MPD contém elementos XML ContentProtection indicando os DRMs suportados (Widevine, PlayReady, FairPlay). O player seleciona o DRM apropriado com base na plataforma e solicita uma licença através da URL especificada.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também