У ffmpeg, як затримати лише аудіо у форматі .mp4 без перетворення звуку?


44

У моєму файлі .mp4 затримка звуку становить -3840 мс. Я синхронізував його в KMplayer, і я не хочу використовувати MKVGUI для створення .mkv файлу. Мені просто потрібно затримати аудіо на -3840 мс, все інше недоторкане.
Яка була б правильна команда для досягнення цього за допомогою ffmpeg?
Буду вдячний за вашу допомогу.

Відповіді:


72

Якщо вам потрібно затримати відео на 3,84 секунди, скористайтеся такою командою:

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

Якщо вам потрібно затримати звук на 3,84 секунди, скористайтеся такою командою:

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

Переконайтеся, що ваша збірка ffmpeg не надто стара, достатньо нової, ніж 2012 рік.


Пояснення

-itsoffset 3.84 -i "movie.mp4"

Зсуває часові позначки всіх потоків на 3,84 секунди у вхідному файлі, що відповідає опції (movie.mp4).

-map 1:v -map 0:a

Знімає відеопотік з другого (запізнілого) входу та аудіопотоку з першого входу - звичайно, обидва входи можуть бути одним файлом.

Більш детальне пояснення можна знайти тут:
http://alien.slackbook.org/blog/fixing-audio-sync-with-ffmpeg/


2
Як вибрати один конкретний аудіозапис замість того, щоб затримувати всі аудіозаписи?
Фредо

1
Використання можливостей опції карти . Спочатку потрібно знайти індекс потрібного аудіопотоку у вхідному файлі, використовуючи будь-яку з цих команд: ffprobe.exe "input_file.mp4"або ffmpeg.exe -i "input_file.mp4" Припустимо, що індекс аудіопотоку, який буде затриманий, дорівнює 2 (тобто третій потік) і що затриманий вхід є другий (як у моєму прикладі). Щоб затримати лише третій потік, візьміть усі інші потоки з першого входу і лише один аудіопотік з другого (затримки) входу:-map 0:0 -map 0:1 -map 1:2
Weaver

це не те, що я мав на увазі. У цьому випадку мені все-таки потрібно зателефонувати ffmpeg і проаналізувати результати, щоб знайти індекси. Чи є еквівалент сказати -map eng
Freedo

Ну, але @Freedo, як вам уже повідомляли в superuser.com/questions/639402/… , те, що ви пропонуєте, насправді можливо, вказавши потоки за допомогою значень метаданих, наприклад: -map 1:m:language:eng Однак майте на увазі, що він вибере всі потоки задовольняючи критерію, можливо, включаючи кілька потоків аудіо та / або субтитрів. Ви можете знайти більше інформації в stackoverflow.com/questions/46769419/…
Weaver

1
AFAIK -c copyможе бути використаний замість -vcodec copy -acodec copy, а itsoffsetвпливає тільки на відео, так що, можливо , це буде працювати так само?: ffmpeg -i "movie.mp4" -itsoffset 3.84 -c copy "movie-video-delayed.mp4"І затримати аудіо замість цього просто додати негативний знак тривалості: -3.84.
miyalys

0

Зробіть перший звук тиші:

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

Тоді стислі файли:

ffmpeg -i "concat:silence_3_sec.mp3|input.mp3" -acodec copy out.mp3
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.