ffmpeg zum Aufteilen der MP4-Datei in Segmente … nach dem ersten Segment ist der Ton nicht mehr synchronisiert

ffmpeg zum Aufteilen der MP4-Datei in Segmente … nach dem ersten Segment ist der Ton nicht mehr synchronisiert

Nb: Ich habe fälschlicherweisediese Frage gestelltbei stackoverflow

Ich habe die ffmpeg-Befehlszeile verwendet, die indiese Frageum MKV-Dateien lange Zeit perfekt aufzuteilen. Jetzt habe ich einige MP4-Dateien, die ich aufteilen möchte, und zunächst schien es zu funktionieren, aber bei jedem nachfolgenden Segment nach dem ersten ist der Ton nicht synchron! Und zwar um mehrere Sekunden.

Ich habe versucht, Keyframes zu erzwingen (einen Rat, den ich auf anderen Sites gefunden habe), aber das hat nicht geholfen.

Ich habe ein ganz anderes Programm (Avidemux) ausprobiert und es konnte die Datei mit korrekter Ausgabe teilen, aber es war VIEL langsamer und dauerte über 3 Minuten im Vergleich zu weniger als 2 Sekunden mit ffmpeg. Mit Avidemux konnte ich die genaue Position des I-Frames bestimmen, an der ich teilen wollte. Da ich dachte, dass dies vielleicht das Synchronisierungsproblem war, habe ich genau diese Position ausprobiert (z. B. 00:12:17.111 statt 00:12:16 oder was auch immer), aber das hat auch nicht geholfen.

Gibt es eine Option, die ich bei ffmpeg übersehe, um beim Teilen die Audio- und Videosynchronisierung richtig zu gestalten?

Nur ein Hinweis: Ich habe eine 2013er Version von ffmpeg verwendet. Ich habe diese gerade auf die neueste Version 2.6 aktualisiert, aber das Problem besteht weiterhin.

Antwort1

Aus der Dokumentation geht hervor, dass das Flag -ss je nach Position im Befehl unterschiedliche Aufgaben hat.

-ss Position (Eingabe/Ausgabe) Bei Verwendung als Eingabeoption (vor -i) wird in dieser Eingabedatei nach der Position gesucht. Beachten Sie, dass in den meisten Formaten eine exakte Suche nicht möglich ist, sodass ffmpeg nach dem nächstgelegenen Suchpunkt vor der Position sucht. Wenn die Transkodierung und -accurate_seek aktiviert sind (Standard), wird dieses zusätzliche Segment zwischen dem Suchpunkt und der Position dekodiert und verworfen. Beim Kopieren des Streams oder wenn -noaccurate_seek verwendet wird, bleibt es erhalten.

Bei Verwendung als Ausgabeoption (vor einem Ausgabedateinamen) wird die Eingabe dekodiert, aber verworfen, bis die Zeitstempel die Position erreichen.

Die Position kann entweder in Sekunden oder im Format hh:mm:ss[.xxx] angegeben werden.

Aus Ihrer eigenen Antwort geht hervor, dass der erste Befehl die Logik auf die Ausgabe und der zweite Befehl auf die Eingabe anwendet.

Antwort2

Ich bin nicht sicher, ob ich verstehe, WARUM, aber das Problem war die Reihenfolge der Parameter.

Im verlinkten Beispiel lautet der Befehl:

ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi

Natürlich verwende ich mp4 statt avi, aber ansonsten habe ich den Befehl genau wie oben eingegeben und (mit mp4) ein nicht synchrones Audioergebnis erhalten. Ich bin zufällig auf diesen „Fix“ gestoßen … wenn ich den Befehl stattdessen folgendermaßen eingebe:

ffmpeg -ss 00:30:00 -i input.mp4 -vcoded copy -acodec copy -t 00:30:00 output2.mp4

Ich verstehe die Synchronisierungsprobleme nicht. Warum? Keine Ahnung. Aber es funktioniert. Ich habe es zur Bestätigung ein paar Mal versucht ... wenn man nur die Reihenfolge der Parameter ändert, wird das Problem behoben.

verwandte Informationen