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.

Faixas de áudio e vídeo codificadas
Segmento de inicialização mais fragmentos moof e mdat
A fragmentação move os metadados de cada amostra de um índice central para cada fragmento.

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

  1. Para HLS e Media Source Extensions, o segmento de inicialização é uma caixa ftyp seguida por uma caixa moov que declara as faixas e as descrições das amostras, mas não contém amostras, e uma caixa mvex dentro de moov sinaliza que há fragmentos a seguir. A mídia então chega em caixas moof, cada uma descrevendo amostras cujos bytes ficam na caixa ou nas caixas mdat que vêm depois dela.
  2. Um MP4 comum não pode ser anexado sem alterações a um SourceBuffer de Media Source Extensions: o formato de fluxo de bytes ISO BMFF do W3C exige um erro de anexação quando a caixa moov contém amostras ou não contém mvex. 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 conter mvex. 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.
  3. Todo fragmento de faixa precisa de uma caixa tfdt que contenha seu tempo base de decodificação: HLS exige uma em cada traf, 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ção default_base_moof.
  4. 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 faststart nã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

Transforme conhecimento sobre mídia em um pipeline funcional

Conecte uploads, processamento, IA, armazenamento e entrega por meio de uma única API declarativa, com o stack de codificação, o ajuste de escala e as constantes mudanças de formatos gerenciados para você.

Experimente a Transloadit gratuitamente