В 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
Уивер
это не то, что я имел в виду. В этом случае мне все еще нужно вызвать ffmpeg и проанализировать результаты, чтобы найти индексы. Есть ли эквивалент, чтобы сказать -map eng
Freedo
Ну, @Freedo, как вы уже посоветовали в superuser.com/questions/639402/… , то, что вы предлагаете, действительно возможно, если указать потоки с использованием значений метаданных, например: -map 1:m:language:eng Имейте в виду, что он выберет все потоки удовлетворяющий критерию, возможно, включающий в себя несколько потоков аудио и / или субтитров. Вы можете найти больше информации в stackoverflow.com/questions/46769419/…
Уивер
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
Иван Малышев
источник