In ffmpeg, come ritardare solo l'audio di un video .mp4 senza convertire l'audio?


44

Nel mio file .mp4 il ritardo audio è di -3840 ms. L'ho sincronizzato in KMplayer e non voglio usare MKVGUI per creare un file .mkv. Devo solo ritardare l'audio di -3840 ms, tutto il resto intatto.
Quale sarebbe il comando giusto per ottenere questo risultato usando ffmpeg?
Gradirei il tuo aiuto.

Risposte:


72

Se devi ritardare il video di 3,84 secondi, usa un comando come questo:

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

Se è necessario ritardare l'audio di 3,84 secondi, utilizzare un comando come questo:

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

Assicurati che la tua build di ffmpeg non sia troppo vecchia, più recente del 2012 sarà sufficiente.


Spiegazione

-itsoffset 3.84 -i "movie.mp4"

Offset i timestamp di tutti i flussi di 3,84 secondi nel file di input che segue l'opzione (movie.mp4).

-map 1:v -map 0:a

Prende il flusso video dal secondo ingresso (ritardato) e il flusso audio dal primo ingresso - entrambi gli ingressi possono ovviamente essere lo stesso file.

Una spiegazione più dettagliata può essere trovata qui:
http://alien.slackbook.org/blog/fixing-audio-sync-with-ffmpeg/


2
Come si sceglie una traccia audio specifica anziché ritardare tutte le tracce audio?
Freedo,

1
Utilizzo delle funzionalità dell'opzione mappa . Devi prima trovare l'indice del flusso audio desiderato nel file di input usando uno di questi comandi: ffprobe.exe "input_file.mp4"o ffmpeg.exe -i "input_file.mp4" Supponiamo che l'indice del flusso audio da ritardare sia 2 (cioè il terzo flusso) e che l'ingresso ritardato sia il secondo (come nel mio esempio). Per ritardare solo il terzo flusso, prendi tutti gli altri flussi dal primo ingresso e solo l'unico flusso audio dal secondo ingresso (ritardato):-map 0:0 -map 0:1 -map 1:2
Weaver

non è quello che volevo dire. In questo caso devo ancora chiamare ffmpeg e analizzare i risultati per trovare gli indici. Esiste un equivalente per dire -map eng
Freedo

Bene, @Freedo, come ti è già stato consigliato in superuser.com/questions/639402/… , ciò che suggerisci è in realtà possibile specificando i flussi utilizzando i valori dei metadati, ad esempio: -map 1:m:language:eng Tuttavia, tieni presente che selezionerà tutti i flussi soddisfacendo il criterio, eventualmente includendo più flussi audio e / o sottotitoli. Puoi trovare maggiori informazioni in stackoverflow.com/questions/46769419/…
Weaver

1
Per quanto ne so -c copypuò essere usato al posto di -vcodec copy -acodec copy, e itsoffsetcolpisce solo il video, quindi forse questo dovrebbe funzionare lo stesso ?: ffmpeg -i "movie.mp4" -itsoffset 3.84 -c copy "movie-video-delayed.mp4"e per ritardare l'audio invece è sufficiente aggiungere un segno negativo per la durata: -3.84.
Miyalys,

0

Rendi il primo silenzio audio:

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

Quindi concatena i file:

ffmpeg -i "concat:silence_3_sec.mp3|input.mp3" -acodec copy out.mp3
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.