W ffmpeg, jak opóźnić tylko dźwięk wideo .mp4 bez konwersji dźwięku?

44

W moim pliku .mp4 opóźnienie audio wynosi -3840 ms. Zsynchronizowałem go w KMplayer i nie chcę używać MKVGUI do tworzenia pliku .mkv. Muszę tylko opóźnić dźwięk o -3840 ms, wszystko inne nienaruszone.
Jakie byłoby właściwe polecenie, aby to zrobić za pomocą ffmpeg?
Byłbym wdzięczny za pomoc.

Alireza
źródło

Odpowiedzi:

72

Jeśli chcesz opóźnić wideo o 3,84 sekundy, użyj następującego polecenia:

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

Jeśli chcesz opóźnić dźwięk o 3,84 sekundy, użyj następującego polecenia:

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

Upewnij się, że twoja kompilacja ffmpeg nie jest za stara, wystarczy nowsza wersja niż 2012.


Wyjaśnienie

-itsoffset 3.84 -i "movie.mp4"

Przesuwa znaczniki czasu wszystkich strumieni o 3,84 sekundy w pliku wejściowym następującym po opcji (movie.mp4).

-map 1:v -map 0:a

Pobiera strumień wideo z drugiego (opóźnionego) wejścia i strumień audio z pierwszego wejścia - oba wejścia mogą oczywiście być tym samym plikiem.

Bardziej szczegółowe wyjaśnienie można znaleźć tutaj:
http://alien.slackbook.org/blog/fixing-audio-sync-with-ffmpeg/

Tkacz
źródło
2
Jak wybrać jedną konkretną ścieżkę audio zamiast opóźniać wszystkie ścieżki audio?
Freedo,
1
Korzystanie z możliwości opcji mapy . Najpierw musisz znaleźć indeks żądanego strumienia audio w pliku wejściowym za pomocą dowolnego z tych poleceń: ffprobe.exe "input_file.mp4"lub ffmpeg.exe -i "input_file.mp4" Załóżmy, że indeks strumienia audio, który ma być opóźniony, wynosi 2 (tj. Trzeci strumień) i że opóźnione wejście to drugi (jak w moim przykładzie). Aby opóźnić tylko trzeci strumień, weź wszystkie inne strumienie z pierwszego wejścia i tylko jeden strumień audio z drugiego (opóźnionego) wejścia:-map 0:0 -map 0:1 -map 1:2
Weaver,
to miło nie o to mi chodziło. W tym przypadku nadal muszę wywołać ffmpeg i przeanalizować wyniki, aby znaleźć indeksy. Czy istnieje odpowiednik powiedzenia -map eng
Freedo
Cóż, @Freedo, jak już wspomniano w superuser.com/questions/639402/... , sugerujesz, że w rzeczywistości możliwe jest określenie strumieni za pomocą wartości metadanych, np .: -map 1:m:language:eng Pamiętaj jednak, że wybierze wszystkie strumienie spełniające kryterium, ewentualnie obejmujące wiele strumieni audio i / lub napisów. Więcej informacji można znaleźć na stronie stackoverflow.com/questions/46769419/...
Weaver
1
AFAIK -c copymożna stosować zamiast -vcodec copy -acodec copy, a itsoffsetjedynie wpływa na wideo, więc może to będzie działać tak samo ?: ffmpeg -i "movie.mp4" -itsoffset 3.84 -c copy "movie-video-delayed.mp4"i opóźnić dźwięk zamiast po prostu dodać znak ujemny na czas trwania: -3.84.
miyalys
0

Zrób pierwszą ciszę audio:

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

Następnie pliki konkat:

ffmpeg -i "concat:silence_3_sec.mp3|input.mp3" -acodec copy out.mp3
Ivan Malyshev
źródło