Wie kann man in ffmpeg nur das Audio eines MP4-Videos verzögern, ohne das Audio zu konvertieren?

44

In meiner .mp4-Datei beträgt die Audioverzögerung -3840 ms. Ich habe es in KMplayer synchronisiert und möchte MKVGUI nicht zum Erstellen einer MKV-Datei verwenden. Ich muss den Ton nur um -3840 ms verzögern, alles andere ist intakt.
Was wäre der richtige Befehl, um dies mit ffmpeg zu erreichen?
Ich würde Ihre Hilfe schätzen.

Alireza
quelle

Antworten:

72

Wenn Sie das Video um 3,84 Sekunden verzögern müssen , verwenden Sie einen Befehl wie diesen:

ffmpeg.exe -i "movie.mp4" -itsoffset 3.84 -i "movie.mp4" -map 1:v -map 0:a -c copy "movie-video-delayed.mp4"

Wenn Sie Audio um 3,84 Sekunden verzögern müssen , verwenden Sie einen Befehl wie diesen:

ffmpeg.exe -i "movie.mp4" -itsoffset 3.84 -i "movie.mp4" -map 0:v -map 1:a -c copy "movie-audio-delayed.mp4"

Stellen Sie sicher, dass Ihr ffmpeg-Build nicht zu alt ist. Neuere Versionen als 2012 werden ausreichen.


Erläuterung

-itsoffset 3.84 -i "movie.mp4"

Versetzt die Zeitstempel aller Streams in der Eingabedatei nach der Option (movie.mp4) um 3,84 Sekunden .

-map 1:v -map 0:a

Nimmt den Videostream vom zweiten (verzögerten) Eingang und den Audiostream vom ersten Eingang - beide Eingänge können natürlich dieselbe Datei sein.

Eine ausführlichere Erklärung finden Sie hier:
http://alien.slackbook.org/blog/fixing-audio-sync-with-ffmpeg/

Weber
quelle
2
Wie wählt man eine bestimmte Audiospur aus, anstatt alle Audiospuren zu verzögern?
Freedo
1
Verwenden der Funktionen der Kartenoption . Sie müssen zuerst den Index des gewünschten Audiostreams in der Eingabedatei mit einem dieser Befehle finden: ffprobe.exe "input_file.mp4"oder ffmpeg.exe -i "input_file.mp4" Angenommen, der Index des zu verzögernden Audiostreams ist 2 (dh der dritte Stream) und der verzögerte Eingang ist der zweite (wie in meinem Beispiel). Um nur den dritten Stream zu verzögern, nehmen Sie alle anderen Streams vom ersten und nur den einen Audio-Stream vom zweiten (verzögerten) Eingang:-map 0:0 -map 0:1 -map 1:2
Weaver
das habe ich irgendwie nicht gemeint. In diesem Fall muss ich noch ffmpeg aufrufen und die Ergebnisse analysieren, um die Indizes zu finden. Gibt es eine Entsprechung zu sagen -map deu
Freedo
Nun, @Freedo, wie Sie bereits in Kenntnis gesetzt wurde superuser.com/questions/639402/... , was Sie vorschlagen , ist in der Tat möglich , durch Ströme Angabe mit Metadatenwerten, zB: -map 1:m:language:eng Aber bedenken Sie , dass es alle Streams wählen Erfüllung des Kriteriums, möglicherweise einschließlich mehrerer Audio- und / oder Untertitelströme. Weitere Informationen finden Sie unter stackoverflow.com/questions/46769419/…
Weaver,
1
AFAIK -c copykann anstelle verwendet werden -vcodec copy -acodec copy, und itsoffsetwirkt sich nur auf Video, vielleicht würde dies die gleiche Arbeit ?: ffmpeg -i "movie.mp4" -itsoffset 3.84 -c copy "movie-video-delayed.mp4"und die Audio zu verzögern , anstatt einfach ein negatives Vorzeichen auf die Dauer hinzufügen: -3.84.
Miyalys
0

Machen Sie die erste Audio-Stille:

ffmpeg -f lavfi -i anullsrc=channel_layout=5.1:sample_rate=48000 -t 3 silence_3_sec.mp3

Dann Concat-Dateien:

ffmpeg -i "concat:silence_3_sec.mp3|input.mp3" -acodec copy out.mp3
Ivan Malyshev
quelle