Ratgeber · best practices
Das faststart-Flag: warum MOV-Dateien sofort starten sollen
Der moov-Atom entscheidet, ob ein MOV sofort abspielt oder erst komplett geladen werden muss. Wie -movflags +faststart die Metadaten an den Dateianfang legt und warum mp4mov.de das immer setzt.
Eine MOV-Datei ist eine Baumstruktur
Wenn du eine MOV-Datei mit einem Hex-Editor öffnest, siehst du keine durchgehende Bilderfolge, sondern einen Baum aus benannten Containern. Apple nennt diese Container in der QuickTime-Terminologie atoms. Das MP4-Format stammt vom gleichen ISO Base Media File Format ab und nennt die identischen Bausteine boxes. Beide Container sind eng verwandt, weshalb sich die Verwandtschaft zwischen MP4 und MOV auch an dieser Stelle zeigt (mehr dazu im Vergleich MP4 gegen MOV).
Jeder Atom trägt in seinem Header zwei Angaben: seinen Typ (vier ASCII-Zeichen) und seine Länge in Bytes, gefolgt vom Inhalt. Drei Atome sind für dieses Thema entscheidend:
ftyp(File Type, typisch 24 bis 32 Byte): identifiziert den Container und die kompatiblen Brands.moov(Movie, typisch 1 KB bis 5 MB): der Index mit Metadaten, Sample-Tables, Codec-Konfiguration und Track-Informationen.mdat(Media Data, typisch 95 bis 99 Prozent der Datei): die rohen, codierten Video- und Audio-Frames.
Der entscheidende Punkt: Die Reihenfolge dieser Atome ist nicht fest vorgeschrieben. Ein Muxer darf den moov-Atom vor oder nach dem mdat-Atom schreiben. Beide Varianten sind standardkonform und für Player abspielbar. Der Unterschied wird erst beim Streaming sichtbar.
Default-Verhalten beim Schreiben
Wenn ffmpeg eine neue MOV-Datei schreibt, kennt es die endgültige Größe des mdat-Atoms erst, wenn alle Frames verarbeitet sind. Auch die Sample-Tables im moov-Atom, die für jeden Frame die Byte-Position und die Dauer in mdat verzeichnen, lassen sich erst nach Abschluss finalisieren.
Die einfachste Variante ist daher: zuerst ftyp schreiben, während des Verarbeitens Frame für Frame in mdat schreiben und am Ende den fertigen moov-Atom anhängen. Das Ergebnis sieht so aus:
[ftyp] [mdat: 200 MB Video-Frames] [moov: 800 KB Metadaten]
Diese Reihenfolge ist effizient für lokale Wiedergabe. Ein QuickTime Player öffnet die Datei, springt direkt ans Ende, liest den moov-Atom, springt zurück zum Anfang von mdat und beginnt mit der Wiedergabe. Auf der eigenen Festplatte ist dieser Sprung kostenlos.
Das Problem im Web
Für progressives Laden über HTTP funktioniert dieser Default nicht. Ein Browser lädt eine MOV-Datei von oben nach unten, Byte für Byte. Ohne den moov-Atom weiß er nicht, wo welche Frames liegen, welcher Codec verwendet wird oder wie lang das Video ist. Er kann also gar nicht mit der Dekodierung anfangen.
Liegt der moov-Atom am Dateiende, bedeutet das konkret:
- Der Nutzer klickt Play auf einer 800 MB großen MOV.
- Der Browser liest die ersten Bytes und sieht den
ftyp-Atom. - Es folgt der riesige
mdat-Block, aber keinmoov. - Der Browser muss entweder die letzten Bytes nachfordern oder im schlimmsten Fall die gesamte Datei laden, bevor er den Index hat.
In der Praxis lädt der Player bei unglücklicher Server-Konfiguration die komplette Datei, bevor die Wiedergabe startet. Bei einem 4K-Clip mit 2 GB heißt das: minutenlanges Buffern, schwarzer Player, genervter Zuschauer.
Der faststart-Flag
-movflags +faststart weist den Muxer an, nach dem Schreiben einen zweiten Durchlauf auszuführen, der den moov-Atom an den Anfang der Datei verschiebt. Das + aktiviert den Flag, ohne andere bestehende Flags zu überschreiben. Konkret läuft das so ab:
- ffmpeg schreibt die Datei zunächst normal:
ftyp, dannmdat, dannmoov. - Nach Abschluss öffnet der Muxer die Datei erneut und liest den
moov-Atom. - Er schreibt die Datei neu in der Reihenfolge
ftyp, dannmoov, dannmdat. - Da
moovjetzt vormdatliegt, verschieben sich die Byte-Offsets aller Frames in den Sample-Tables. Der Muxer rechnet diese Offsets um, bevor er denmoov-Atom an die neue Position schreibt.
Das Ergebnis:
[ftyp] [moov: 800 KB Metadaten] [mdat: 200 MB Video-Frames]
Jetzt kann der Browser bereits nach den ersten rund 830 KB mit der Wiedergabe beginnen. Während das Video läuft, lädt er die mdat-Daten parallel nach. Bei normalen Internet-Geschwindigkeiten füllt sich der Puffer schneller, als die Wiedergabe ihn leert, und der Zuschauer sieht keinen Stillstand.
Reihenfolge vor und nach faststart
Die folgende Tabelle stellt gegenüber, wie sich die beiden Atom-Reihenfolgen in der Praxis verhalten:
| Aspekt | moov am Ende (ohne faststart) | moov am Anfang (mit faststart) |
|---|---|---|
| Web-Wiedergabe (HTTP) | Player muss bis ans Dateiende laden oder zusätzliche Range-Requests stellen, bevor das erste Bild kommt | Wiedergabe startet nach wenigen hundert KB, Rest lädt parallel nach |
| Lokales Abspielen | Funktioniert sofort, der Player springt direkt ans Dateiende | Funktioniert sofort, kein Nachteil |
| Datei-Schreibzeit | Minimal, nur ein Durchlauf | Etwas länger, zweiter Durchlauf schreibt die Datei einmal um |
| Geeignet für Streaming | Nein | Ja |
Die einzige messbare Einbuße steht in der Spalte Datei-Schreibzeit, und die ist beim Stream-Copy klein. Genau diesen Unterschied zwischen reinem Umpacken und echtem Neucodieren erklärt der Ratgeber zu Stream-Copy gegen Re-Encode im Detail.
Wie sich Player ohne faststart verhalten
Wie genau ein Player auf eine MOV ohne faststart reagiert, hängt vom Browser und vom Server ab. Es gibt nicht den einen Worst Case, sondern ein Spektrum:
- HTML5
<video>mit Range-Requests: Der Browser liest zunächst die ersten Bytes, sieht denftyp-Atom, aber keinenmoov, und fordert dann gezielt die letzten Bytes der Datei an. So findet er denmoov-Atom, ohne alles zu laden. Voraussetzung ist, dass der Server HTTP-Range-Requests unterstützt und den HeaderAccept-Ranges: bytessendet. - HTML5
<video>ohne Range-Requests: Der Browser lädt die Datei linear von vorne, bis er denmoov-Atom am Ende erreicht. Das ist der eigentliche Worst Case und der Grund, warum eine große Datei minutenlang schwarz bleiben kann. - Mobile Browser wie Safari auf iOS oder Chrome auf Android nutzen zwar Range-Requests, brauchen bei hoher Latenz aber mehrere Hin- und Rückwege, um den Index zu finden. Genau hier macht faststart den größten Unterschied.
Moderne Browser sind clever und raten oft richtig: Sie fordern als Erstes die letzten rund 1 MB an, in der Hoffnung, dass der moov-Atom dort liegt. Bei kleinen Index-Tabellen klappt das. Ist der moov-Atom größer, folgen weitere Anfragen, und jede kostet auf einer langsamen mobilen Verbindung schnell mehrere Sekunden. Mit faststart entfällt dieses Raten komplett, weil der Index garantiert direkt hinter ftyp steht.
Kosten und Nutzen
Der faststart-Flag kostet:
- Zusätzlichen Schreib-Aufwand am Ende, da die Datei einmal komplett neu geschrieben wird.
- Auf langsamen Datenträgern oder bei sehr großen Dateien einige Sekunden mehr.
- Kurzfristig etwas mehr temporären Speicher, weil zwischenzeitlich beide Fassungen vorliegen können.
Er bringt:
- Sofortige Wiedergabe in HTML5-Video-Playern und mobilen Browsern.
- Eine deutlich bessere Erfahrung bei langsamen Verbindungen.
- Funktionierende HTTP-Range-Requests in CDNs und Web-Servern.
- Eine saubere Ausgangsbasis für Werkzeuge, die den
moov-Atom zuerst erwarten.
Der Vergleich fällt eindeutig aus: ein paar Sekunden Mehraufwand beim Schreiben gegen sofortige progressive Wiedergabe für alle Zuschauer.
Warum mp4mov.de das immer setzt
mp4mov.de wandelt MP4 zu MOV komplett im Browser über ffmpeg.wasm um, ohne dass eine Datei den Rechner verlässt. Der Standardweg ist dabei das verlustfreie Stream-Copy: Die Video- und Audio-Spuren werden nur in den MOV-Container umverpackt, ohne neu zu codieren. Genau bei diesem Umpacken wird -movflags +faststart automatisch gesetzt, und ebenso beim Re-Encode, falls eine Spur tatsächlich neu codiert werden muss. Du musst dafür nichts einstellen oder anhaken.
Im Browser läuft faststart konzeptionell identisch zum nativen ffmpeg, mit einem Vorteil: Die Datei liegt komplett im Arbeitsspeicher. Der zweite Durchlauf verschiebt die Atom-Struktur im linearen WASM-Speicher, und weil dieser direkt adressierbar ist, dauert der Vorgang nur wenige hundert Millisekunden, weitgehend unabhängig von der Dateigröße. Bei einem 50 MB-Clip fällt der Aufwand gar nicht auf, bei 500 MB ist er messbar, aber nicht spürbar.
Das Ergebnis ist eine MOV-Datei, die sowohl auf einer Website sofort losspielt als auch in einer Schnittsoftware sauber erkannt wird. Wenn du das MOV anschließend in eine Timeline ziehst, profitierst du von der gleichen sauberen Struktur, wie sie der Ratgeber zu MOV im Videoschnitt mit Final Cut beschreibt.
Wie du faststart prüfst
Du kannst die Position des moov-Atoms in einer bestehenden Datei selbst kontrollieren. Mit ffprobe zeigt dieser Befehl die Byte-Position:
ffprobe -v trace input.mov 2>&1 | grep -m1 moov
Liegt der moov-Atom nahe Byte 0 (typisch zwischen 32 und einigen hundert), ist faststart aktiv. Liegt er nahe der Dateigröße am Ende, fehlt der Flag. Eine vorhandene Datei lässt sich übrigens ohne Neucodieren nachrüsten:
ffmpeg -i input.mov -c copy -movflags +faststart output.mov
Dieser Aufruf nutzt Stream-Copy und braucht nur Sekunden, weil nichts neu codiert wird. Genau diesen Weg geht mp4mov.de für dich, ohne dass du ein Terminal öffnen musst.
Was hängen bleibt
Der moov-Atom ist das Inhaltsverzeichnis einer MOV-Datei. Liegt er am Ende, muss der Browser im schlimmsten Fall die ganze Datei laden, bevor das erste Bild erscheint. Mit -movflags +faststart schiebt ffmpeg den Atom in einem zweiten Durchlauf an den Anfang, direkt hinter ftyp. mp4mov.de setzt diesen Flag bei jeder Umwandlung automatisch, sowohl beim verlustfreien Umpacken als auch beim Re-Encode, damit deine MOV-Datei überall sofort startet.
Hast du einen Fehler entdeckt oder einen Quellen-Hinweis für uns? Schreib gern an info@akara-solutions.de.
Quellen
- Apple: QuickTime File Format Specification (Atom-Struktur)
- ffmpeg.org: -movflags +faststart Dokumentation
- MDN: HTML video progressive download
Korrekturen oder bessere Quellen? Schreib an info@akara-solutions.de. Änderungen landen mit Datum auf /korrekturen.
