O que é MP4 fragmentado?
O MP4 fragmentado divide um arquivo de mídia base ISO em dados de inicialização e fragmentos de mídia que podem ser entregues separadamente. Os fragmentos geralmente contêm metadados moof seguidos por dados de mídia mdat.
Como funciona o MP4 fragmentado
Um MP4 fragmentado separa os dados estáveis de inicialização das faixas de uma sequência de grupos de amostras temporizadas gravados separadamente. A parte de inicialização declara as faixas e os formatos das amostras e, na forma exigida por HLS e Media Source Extensions, não contém amostras, enquanto cada fragmento carrega os metadados do grupo necessários para localizar e atribuir marcas de tempo aos dados de mídia adjacentes. Isso difere de um MP4 convencional finalizado, cujas tabelas centrais de amostras descrevem a apresentação completa. A fragmentação permite geração incremental, distribuição segmentada e fluxos de trabalho de anexação no navegador sem esperar por um índice global final. Ela altera a organização do contêiner, não o codec, e CMAF se baseia nessa mesma organização para que playlists HLS e manifestos DASH possam referenciar um único conjunto de segmentos.
Informações essenciais
- Para HLS e Media Source Extensions, o segmento de inicialização é uma caixa
ftypseguida por uma caixamoovque declara as faixas e as descrições das amostras, mas não contém amostras, e uma caixamvexdentro demoovsinaliza que há fragmentos a seguir. A mídia então chega em caixasmoof, cada uma descrevendo amostras cujos bytes ficam na caixa ou nas caixasmdatque vêm depois dela. - Um MP4 comum não pode ser anexado sem alterações a um
SourceBufferde Media Source Extensions: o formato de fluxo de bytes ISO BMFF do W3C exige um erro de anexação quando a caixamoovcontém amostras ou não contémmvex. Ele também não é um segmento de mídia HLS válido: a RFC 8216 exige que todo segmento use um formato descrito por ela, e seu único formato MP4 é o MP4 fragmentado, cuja seção de inicialização deve ter uma contagem de amostras igual a zero e contermvex. Fragmentar é uma etapa de reempacotamento, portanto o FFmpeg pode copiar fluxos existentes para um arquivo fragmentado sem recodificação quando o navegador já oferece suporte aos codecs e os quadros-chave existentes estão nos pontos em que os segmentos precisam começar. - Todo fragmento de faixa precisa de uma caixa
tfdtque contenha seu tempo base de decodificação: HLS exige uma em cadatraf, e o formato de fluxo de bytes de Media Source Extensions exige um erro de anexação na ausência dela. As marcas de tempo de HLS devem dar continuidade ao segmento anterior, a menos que a playlist indique uma descontinuidade, e a especificação HLS alerta que descontinuidades não indicadas podem causar erros de reprodução. A especificação de autoria da Apple estabelece a regra para fMP4: o tempo de decodificação do fragmento de faixa deve ser consistente com o tempo de decodificação e a duração do segmento anterior. Em Media Source Extensions, um quadro codificado cuja marca de tempo de decodificação seja anterior à do quadro anterior, ou posterior a ela por mais de duas vezes a duração do último quadro, faz com que todos os buffers de faixa aguardem um novo ponto de acesso aleatório. Tanto HLS quanto o formato de fluxo de bytes também exigem endereçamento relativo ao fragmento de filme em vez de deslocamentos absolutos em bytes, que o FFmpeg grava com sua opçãodefault_base_moof. - Inicie os segmentos de vídeo em um ponto de acesso aleatório. HLS diz que um segmento contendo H.264 deve incluir um quadro IDR e que os quadros anteriores ao primeiro IDR podem ser baixados, mas descartados; a especificação de autoria da Apple exige que os segmentos de vídeo comecem com um quadro IDR, e as diretrizes do DASH-IF colocam um ponto de acesso ao fluxo semelhante a IDR no início de cada segmento para facilitar a alternância. Após um segmento de inicialização, um buffer de faixa de Media Source Extensions descarta quadros codificados até que chegue um ponto de acesso aleatório.
Quando o MP4 fragmentado é importante
Desenvolvedores escolhem MP4 fragmentado para segmentos HLS ou DASH, para mídia anexada por meio de Media Source Extensions e para gravações que precisam continuar legíveis se a gravação terminar antes do previsto. Para um único arquivo que precise ser aberto por players e editores variados, um MP4 comum geralmente é a opção mais segura de organização: a documentação do FFmpeg observa que os arquivos fragmentados são menos compatíveis com outros aplicativos.
Casos de uso comuns de MP4 fragmentado
- Entrega por HLS de vídeo HEVC ou AV1 para dispositivos Apple, para os quais a especificação de autoria da Apple exige fMP4; vídeo H.264 pode usar segmentos fMP4 ou de fluxo de transporte MPEG.
- Um único conjunto de segmentos CMAF referenciado tanto por uma playlist HLS quanto por um manifesto DASH, o que a Apple descreve como uma forma de permitir o uso eficiente de cache na entrega para várias plataformas.
- Players personalizados no navegador que anexam segmentos de inicialização e de mídia por meio de Media Source Extensions.
- Gravações longas ou ao vivo: o FFmpeg observa que um arquivo fragmentado continua decodificável se a gravação for interrompida e exige menos memória ao gravar arquivos muito longos.
Trabalhar com MP4 fragmentado
No FFmpeg, a fragmentação é uma configuração dos multiplexadores mov, mp4 e ismv, e não do codificador. A opção frag_keyframe inicia um novo fragmento em cada quadro-chave de vídeo, portanto, com essa opção, o intervalo de quadros-chave do codificador determina onde os fragmentos começam. A cópia de fluxos repassa os pacotes sem decodificá-los nem codificá-los, portanto o vídeo copiado mantém seus quadros-chave existentes, e alterar o espaçamento entre eles exige recodificação. As opções separadas cmaf e dash gravam uma saída fragmentada compatível com esses formatos.
Em HLS, o MP4 fragmentado altera tanto a playlist quanto a mídia. Todo segmento fMP4 deve ter uma tag EXT-X-MAP que aponte para sua seção de inicialização, e o uso dessa tag em uma playlist de mídia comum exige a versão 6 ou superior do protocolo. A Apple observa que HLS definiu segmentos MPEG-4 fragmentados em setembro de 2016 e que clientes baseados em revisões anteriores provavelmente não conseguirão lidar com conteúdo CMAF.
Quanto custa
- A documentação do FFmpeg descreve os arquivos fragmentados como menos compatíveis com outros aplicativos do que os arquivos MP4 comuns e informa que sua opção
faststartnão funciona com saída fragmentada. - A MDN informa que um arquivo fragmentado é ligeiramente maior que o original, geralmente em 1 por cento ou menos, porque os metadados ficam distribuídos pelo arquivo.
Como a Transloadit ajuda com MP4 fragmentado
O Robot /video/adaptive da Transloadit documenta um valor cmaf para seu parâmetro technique que produz saída CMAF baseada em FFmpeg, com manifestos MPEG-DASH e HLS que referenciam os mesmos segmentos fMP4.
A documentação do Robot menciona segmentos fMP4 apenas para technique: cmaf; ela não informa o contêiner dos segmentos para as técnicas hls ou dash. Ela também informa que a saída CMAF coloca todo o áudio em um único conjunto de adaptação e indica technique: hls com audio_group para áudio em vários idiomas.
Explore os formatos de arquivo e os recursos de compressão da Transloadit
Fontes
- W3C: formato de fluxo de bytes ISO BMFF (segmentos de inicialização, segmentos de mídia e pontos de acesso aleatório)
- RFC 8216: HTTP Live Streaming, seção 3 (segmentos de mídia), seção 3.3 (MPEG-4 fragmentado) e seção 4.3.2.5 (EXT-X-MAP)
- W3C: Media Source Extensions (processamento de quadros codificados e pontos de acesso aleatório)
- Documentação de formatos do FFmpeg: multiplexadores MOV/MPEG-4/ISOMBFF, fragmentação e movflags
- Documentação do FFmpeg: seção 3.1, cópia de fluxos
- MDN: transcodificação de recursos para Media Source Extensions
- Apple: especificação de autoria HLS para dispositivos Apple
- Apple: sobre o Common Media Application Format com HTTP Live Streaming (HLS)
- Pontos de interoperabilidade do DASH-IF v4.3, seção 3.2.1 (restrições do formato de segmento)