Was ist fragmentiertes MP4?

Fragmentiertes MP4 unterteilt eine ISO-Basismediendatei in Initialisierungsdaten und separat auslieferbare Medienfragmente. Fragmente enthalten üblicherweise moof-Metadaten, gefolgt von mdat-Mediendaten.

Codierte Audio- und Videospuren
Initialisierungssegment plus moof- und mdat-Fragmente
Beim Fragmentieren werden die Metadaten der einzelnen Samples aus einem zentralen Index in die jeweiligen Fragmente verlagert.

So funktioniert fragmentiertes MP4

Ein fragmentiertes MP4 trennt die stabile Initialisierung der Spuren von einer Folge separat geschriebener Abfolgen zeitlich zugeordneter Samples. Der Initialisierungsteil deklariert Spuren und Sample-Formate und enthält in der von HLS und Media Source Extensions geforderten Form keine Samples. Jedes Fragment enthält dagegen die Metadaten der jeweiligen Sample-Abfolge, die nötig sind, um die angrenzenden Mediennutzdaten zu lokalisieren und mit Zeitstempeln zu versehen. Das unterscheidet sich von einem herkömmlichen finalisierten MP4, dessen zentrale Sample-Tabellen die vollständige Medienpräsentation beschreiben. Fragmentierung ermöglicht die schrittweise Erzeugung, segmentierte Verteilung und das Anhängen von Daten im Browser, ohne auf einen abschließenden globalen Index warten zu müssen. Sie verändert den Containeraufbau, nicht den Codec. CMAF baut auf demselben Aufbau auf, sodass HLS-Playlists und DASH-Manifeste auf einen gemeinsamen Satz von Segmenten verweisen können.

Wichtige Fakten

  1. Für HLS und Media Source Extensions besteht das Initialisierungssegment aus einer Box ftyp, gefolgt von einer Box moov, die Spuren und Sample-Beschreibungen deklariert, aber keine Samples enthält. Eine Box mvex innerhalb von moov signalisiert, dass Fragmente folgen. Die Medien treffen anschließend als Boxen moof ein. Jede beschreibt Samples, deren Bytes in der nachfolgenden Box oder den nachfolgenden Boxen mdat liegen.
  2. Ein reguläres MP4 lässt sich nicht unverändert an SourceBuffer von Media Source Extensions anhängen: Das W3C-ISO-BMFF-Bytestromformat verlangt einen Fehler beim Anhängen, wenn die Box moov Samples enthält oder mvex fehlt. Es ist auch kein gültiges HLS-Mediensegment: RFC 8216 verlangt, dass jedes Segment eines der darin beschriebenen Formate verwendet. Das einzige darin beschriebene MP4-Format ist fragmentiertes MP4, dessen Initialisierungsabschnitt eine Sample-Anzahl von null haben und mvex enthalten muss. Fragmentieren ist ein Umpacken. FFmpeg kann daher vorhandene Streams ohne erneutes Encoding in eine fragmentierte Datei kopieren, wenn der Browser die Codecs bereits unterstützt und die vorhandenen Keyframes an den erforderlichen Segmentanfängen liegen.
  3. Jedes Spurfragment benötigt eine Box tfdt mit seiner Basis-Decodierzeit: HLS verlangt sie in jedem traf, und das Bytestromformat von Media Source Extensions verlangt ohne sie einen Fehler beim Anhängen. HLS-Zeitstempel müssen an das vorherige Segment anschließen, sofern die Playlist keine Diskontinuität markiert. Die HLS-Spezifikation warnt, dass nicht markierte Diskontinuitäten Wiedergabefehler auslösen können. Die Authoring-Spezifikation von Apple formuliert die Regel für fMP4 so: Die Decodierzeit des Spurfragments muss mit der Decodierzeit und der Dauer des vorherigen Segments konsistent sein. Liegt in Media Source Extensions der Decodierzeitstempel eines codierten Bildes vor dem des vorherigen Bildes oder mehr als das Doppelte der letzten Bilddauer danach, wartet jeder Spurpuffer auf einen neuen wahlfreien Zugriffspunkt. Sowohl HLS als auch das Bytestromformat verlangen außerdem eine zum Filmfragment relative Adressierung statt absoluter Byte-Offsets. FFmpeg schreibt diese mit dem Flag default_base_moof.
  4. Beginnen Sie Videosegmente an einem wahlfreien Zugriffspunkt. Laut HLS sollte ein Segment mit H.264 ein IDR-Bild enthalten; Bilder vor dem ersten IDR-Bild können heruntergeladen, aber verworfen werden. Die Authoring-Spezifikation von Apple verlangt, dass Videosegmente mit einem IDR-Bild beginnen. Die DASH-IF-Richtlinien sehen für einfaches Umschalten einen IDR-ähnlichen Stream-Zugriffspunkt am Anfang jedes Segments vor. Nach einem Initialisierungssegment verwirft ein Spurpuffer von Media Source Extensions codierte Bilder, bis ein wahlfreier Zugriffspunkt eintrifft.

Wann fragmentiertes MP4 relevant ist

Entwickler wählen fragmentiertes MP4 für HLS- oder DASH-Segmente, für Medien, die über Media Source Extensions angehängt werden, und für Aufzeichnungen, die bei vorzeitigem Schreibabbruch lesbar bleiben müssen. Für eine einzelne Datei, die beliebige Player und Editoren öffnen müssen, ist ein reguläres MP4 meist der sicherere Aufbau: Die FFmpeg-Dokumentation weist darauf hin, dass fragmentierte Dateien mit anderen Anwendungen weniger kompatibel sind.

Häufige Anwendungsfälle für fragmentiertes MP4

  • HLS-Auslieferung von HEVC- oder AV1-Video an Apple-Geräte, für die die Authoring-Spezifikation von Apple fMP4 verlangt; H.264-Video darf entweder fMP4- oder MPEG-Transportstromsegmente verwenden.
  • Ein gemeinsamer Satz von CMAF-Segmenten, auf den sowohl eine HLS-Playlist als auch ein DASH-Manifest verweisen. Laut Apple ermöglicht dies effizientes Caching bei der Auslieferung an mehrere Plattformen.
  • Individuelle Browser-Player, die Initialisierungs- und Mediensegmente über Media Source Extensions anhängen.
  • Lange oder Live-Aufzeichnungen: FFmpeg weist darauf hin, dass eine fragmentierte Datei bei unterbrochenem Schreiben decodierbar bleibt und beim Schreiben sehr langer Dateien weniger Arbeitsspeicher benötigt.

Arbeiten mit fragmentiertem MP4

In FFmpeg ist Fragmentierung eine Einstellung der Muxer mov, mp4 und ismv, keine Encoder-Einstellung. Das Flag frag_keyframe beginnt bei jedem Video-Keyframe ein neues Fragment. Mit diesem Flag bestimmt daher das Keyframe-Intervall des Encoders, wo Fragmente beginnen. Stream-Kopie reicht Pakete weiter, ohne sie zu decodieren oder zu codieren. Kopiertes Video behält daher seine vorhandenen Keyframes; eine Änderung ihrer Abstände erfordert erneutes Encoding. Die separaten Flags cmaf und dash schreiben fragmentierte Ausgaben, die mit den jeweiligen Formaten kompatibel sind.

In HLS verändert fragmentiertes MP4 neben den Medien auch die Playlist. Jedes fMP4-Segment muss ein Tag EXT-X-MAP haben, das auf seinen Initialisierungsabschnitt verweist. Die Verwendung dieses Tags in einer regulären Medien-Playlist erfordert Protokollversion 6 oder höher. Apple weist darauf hin, dass HLS fragmentierte MPEG-4-Segmente im September 2016 definierte und dass Clients auf Basis früherer Revisionen CMAF-Inhalte wahrscheinlich nicht verarbeiten können.

Was es kostet

  • Die FFmpeg-Dokumentation beschreibt fragmentierte Dateien als weniger kompatibel mit anderen Anwendungen als reguläre MP4-Dateien und erklärt, dass die Option faststart bei fragmentierter Ausgabe nicht funktioniert.
  • Laut MDN ist eine fragmentierte Datei etwas größer als das Original, üblicherweise um 1 Prozent oder weniger, da Metadaten über die gesamte Datei verteilt sind.

So hilft Transloadit bei fragmentiertem MP4

Transloadits Robot /video/adaptive dokumentiert den Wert cmaf für seinen Parameter technique. Dieser erzeugt FFmpeg-basierte CMAF-Ausgaben mit MPEG-DASH- und HLS-Manifesten, die auf dieselben fMP4-Segmente verweisen.

Die Robot-Dokumentation nennt fMP4-Segmente nur für technique: cmaf; sie gibt den Segmentcontainer für die Verfahren hls oder dash nicht an. Sie erklärt außerdem, dass die CMAF-Ausgabe alle Audiospuren in einem Adaptation Set zusammenfasst, und verweist für mehrsprachiges Audio auf technique: hls mit audio_group.

Entdecken Sie Transloadits Möglichkeiten für Dateiformate & Komprimierung

Quellen

Machen Sie aus Medienwissen eine funktionierende Pipeline

Verbinden Sie Uploads, Verarbeitung, KI, Storage und Auslieferung über eine deklarative API – um Encoding-Stack, Skalierung und ständig wechselnde Formate müssen Sie sich nicht selbst kümmern.

Transloadit kostenlos ausprobieren