ffmpeg добавляет аудио, но сохраняет длину видео одинаковой (не -shortest)

12

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

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

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

stealthcopter
источник
Пожалуйста, выберите правильный ответ. Единственный правильный вариант - @Zurechtweiser.
Роэль Ван де Паар

Ответы:

13

Я полагаю, что вы можете достичь желаемой цели, используя опцию -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

Deadcode
источник
Вы должны упомянуть, что -filter_complexопция принудительно перекодирует - например, можно запускать, ffmpeg -i videofile.mp4 -i audiofile.wav -c:v copy output.mp4но нетffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -c:v copy -shortest output.mp4
Eugen Rieck
Это противоположный ответ на запрос. OP просит завершить видео, когда аудио заканчивается, ответ дается, чтобы добавить звуковую тишину, если аудио короче, чем видео. Этот ответ неверен.
Роэль Ван де Паар
Это не «противоположность» тому, что запросил ОП. OP хотят, чтобы выходное видео было длиной входного видео, независимо от длины звуковой дорожки. Мой ответ касается обстоятельств, когда входное видео длиннее аудиофайла. У OP уже есть решение для случая, когда входное видео короче, чем аудиофайл, который должен использовать -shortest.
Deadcode
12
  • Если длина видео короче, чем длина звука, -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фильтр без графа фильтра, что позволит выполнять мультиплексирование без перекодирования.

Евгений Рик
источник
@RoelVandePaar Как я уже сказал: если длина видео короче, чем длина звука -shortest, используйте этот обходной путь, если вы хотите добавить тишину без перекодирования.
Евгений Рик,
Поправь, пропустил это на просмотре. Удален ввод. Не стесняйтесь делать то же самое.
Роэль Ван де Паар
5

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

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

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

Zurechtweiser
источник
Автор вопроса хочет зациклить аудиофайл, пока видео еще не закончено. Это работает для этого?
Рафаэль Санчес
@RafaelSanches Нет, он не делает.
Цюрихтвайзер
Автор не хочет зацикливать аудио. Этот ответ также является единственным правильным, который делает то, что спрашивал ОП; конец видео, когда заканчивается входное видео.
Роэль Ван де Паар