83 votes

Dans ffmpeg, comment retarder uniquement l'audio d'une vidéo .mp4 sans convertir l'audio?

Dans mon fichier .mp4, le délai audio est de -3840 ms. Je l'ai synchronisé dans KMplayer et je ne veux pas utiliser MKVGUI pour créer un fichier .mkv. J'ai juste besoin de retarder l'audio de 3840 ms, tout le reste doit rester intact.
Quelle serait la bonne commande pour accomplir cela en utilisant ffmpeg?
Je vous serais reconnaissant pour votre aide.

145voto

Weaver Points 1664

Si vous avez besoin de retarder la vidéo de 3,84 secondes, utilisez une commande comme celle-ci :

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

Si vous avez besoin de retarder l'audio de 3,84 secondes, utilisez une commande comme celle-ci :

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

Assurez-vous que votre installation de ffmpeg n'est pas trop ancienne, une version plus récente que 2012 suffira.


Explication

-itsoffset 3.84 -i "movie.mp4"

Décale les horodatages de toutes les pistes de 3,84 secondes dans le fichier d'entrée qui suit l'option (movie.mp4).

-map 1:v -map 0:a

Prend la piste vidéo de la seconde entrée (avec retard) et la piste audio de la première entrée - les deux entrées peuvent bien sûr être le même fichier.

Une explication plus détaillée peut être trouvée ici :
http://alien.slackbook.org/blog/fixing-audio-sync-with-ffmpeg/

3voto

Guest Points 1

Faire du premier audio un silence :

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

Ensuite concaténer les fichiers :

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

1voto

Zimba Points 753

J'ai extrait l'audio avec Audacity, puis j'ai coupé un peu de silence (égal au décalage) à la fin de la vidéo, et je l'ai ajouté au début de l'audio.
Après avoir apporté d'autres ajustements à l'audio comme normalisation, j'ai exporté l'audio et remplacé l'audio d'origine via ffmpeg :

ffmpeg-i "in.mp4" -i "synced.m4a" -vcodec copy -acodec copy -map 0:0 -map 1:0 out.mp4

0voto

Hewey Dewey Points 11

Les nouvelles versions de ffmpeg nécessitent que les options -map soient situées juste avant les options de sortie. Par exemple : ffmpeg.exe %InputOpts% -i %1 -itsoffset 1.00 -i %1 %CodecsOpts% %MapOpts% %OutputOpts%

0voto

user1593842 Points 101

Comme indiqué dans la réponse actuellement le mieux notée, vous pouvez utiliser -itoffset de ffmpeg. Et selon le wiki ffmpeg, si vous ne voulez pas décaler tous les flux, il vous suffit de spécifier le fichier d'entrée deux fois, une fois pour les flux que vous souhaitez conserver tels quels et une fois de plus pour les flux que vous souhaitez décaler. Ensuite, il vous suffit de mapper les flux que vous voulez sur le fichier de sortie final. De cette façon, il n'est pas nécessaire d'extraire les flux pour ensuite les remuxer ensemble plus tard.

Par exemple (copié du wiki), si vous voulez que tous les flux audio soient décalés de 5 secondes

ffmpeg -i video.mp4 -itsoffset 5 -i video.mp4 -map 0:v -map 1:a out.mp4

-map 0:v copiera la vidéo du premier fichier d'entrée (video.mp4)

-map 0:a copiera l'audio du deuxième fichier d'entrée. Qui se trouve être aussi video.mp4, mais décalé de 5 secondes grâce à l'utilisation de -ifoffset juste avant le drapeau -i correspondant

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X