8

Я добавляю аудио в видео файл, используя ffmpeg, вот так

ffmpeg -i videofile.mp4 -i audiofile.wav output.mp4

Однако это расширяет выходной видеофайл до длины аудиофайла, если он длиннее видео. Использование -shortest обрезает видеофайл, если аудиофайл короче, чем видео. Так есть ли флаг, указывающий ffmpeg обрезать сохранение длины выходного видео до длины входного видео?

3 ответа3

11

Я полагаю, что вы можете достичь желаемой цели, используя опцию -filter_complex и опцию фильтра apad, чтобы дополнить ваш звук тишиной в конце, если видео длиннее. Ваша команда будет:

ffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -shortest output.mp4

Это предполагает, что аудио, которое вы хотите, находится в первом потоке audiofile.wav, синтаксис [A:B] говорит, что нужно взять B-й поток с A-го входа (оба начинаются с 0, поэтому [1:0] 1-й поток от 2-го входа, или audiofile.wav выше).

Подробности на:https://www.ffmpeg.org/ffmpeg-filters.html#Examples-68

8
  • Если длина видео короче, чем длина звука, то вам нужен -shortest .
  • Если длина видео больше, чем длина звука, то никакой флаг вообще не будет тем, что вам нужно.

Нет флага для автоматизации этого решения.

РЕДАКТИРОВАТЬ

Вдохновленный ответом @ deadcode, мне нужно прояснить, что "нет флага для автоматизации", конечно, не соответствует действительности, если вы хотите перекодировать: в этом случае используйте apad как предложено @deadcode.

Однако, если вы хотите избежать перекодирования (т.е. -c:v copy), ответ остается в силе.

Существует обходной путь, использующий демультиплексор ffconcat , но он требует небольшой работы:

  • создайте файл, содержащий тишину в том же формате, что и ваш аудиофайл ("silence.wav")
  • Создайте файл concat «audio.ffconcat» (с таким количеством строк молчания, сколько нужно, чтобы звук был достаточно длинным):

,

file 'audiofile.wav'
file 'silence.wav'
file 'silence.wav'
...
file 'silence.wav'
  • запустите ffmpeg -i videofile.mp4 -f concat -i audio.ffconcat -c:v copy output.mp4

Это позволит синтезировать фильтр apad без графа фильтров, что позволит выполнять мультиплексирование без перекодирования.

2

Если вы знаете длину вашего видео-файла, вы можете сделать это, используя

ffmpeg -i videofile.mp4 -i audiofile.wav -t 43 output.mp4

Где 43 - длина вашего видео-файла в секундах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .