Dans ffmpeg, comment ne retarder que l'audio d'une vidéo au format .mp4 sans convertir l'audio?

44

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

Alireza
la source

Réponses:

72

Si vous devez 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 devez 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 version de ffmpeg n’est pas trop ancienne. Une version plus récente que 2012 suffira.


Explication

-itsoffset 3.84 -i "movie.mp4"

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

-map 1:v -map 0:a

Prend le flux vidéo de la deuxième entrée (retardée) et le flux 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/

Tisserand
la source
2
Comment choisir une piste audio spécifique au lieu de retarder toutes les pistes audio?
Freedo
1
Utilisation des fonctionnalités de l' option map . Vous devez d’abord rechercher l’index du flux audio souhaité dans le fichier d’entrée à l’aide de l’une des commandes suivantes: ffprobe.exe "input_file.mp4"ou ffmpeg.exe -i "input_file.mp4" Supposons que l’index du flux audio à retarder soit égal à 2 (c’est-à-dire le troisième flux) et que l’entrée retardée soit le deuxième (comme dans mon exemple). Pour retarder uniquement le troisième flux, prenez tous les autres flux de la première entrée et uniquement le flux audio de la deuxième entrée (retardée):-map 0:0 -map 0:1 -map 1:2
Weaver
c'est gentil pas ce que je voulais dire. Dans ce cas, je dois encore appeler ffmpeg et analyser les résultats pour trouver les index. Y a-t-il un équivalent à dire -map fre
Freedo
Eh bien, @ Freedo, comme vous avez déjà été informé dans superuser.com/questions/639402/… , ce que vous suggérez est en fait possible en spécifiant des flux en utilisant des valeurs de métadonnées, par exemple: -map 1:m:language:eng Cependant, gardez à l'esprit qu'il sélectionnera tous les flux satisfaisant au critère, y compris éventuellement plusieurs flux audio et / ou sous-titres. Vous pouvez trouver plus d'informations dans stackoverflow.com/questions/46769419/…
Weaver
1
AFAIK -c copypeut être utilisé au lieu de -vcodec copy -acodec copy, et itsoffsetne concerne que la vidéo, alors peut - être cela fonctionnerait même ?: ffmpeg -i "movie.mp4" -itsoffset 3.84 -c copy "movie-video-delayed.mp4"et de retarder simplement au lieu de l'audio ajouter un signe négatif à la durée: -3.84.
miyalys
0

Rendre le premier silence audio:

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

Puis concattez les fichiers:

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