ffmpeg додайте звук, але збережіть довжину відео однаковою (не найкоротшою)


12

Я додаю аудіо у відео-файл, використовуючи ffmpeg, як так

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

Однак це розширює вихідний відеофайл на довжину аудіофайлу, якщо він довший, ніж відео. Використання -Shortest скорочує відеофайл, якщо звуковий файл коротший, ніж у відео. Так чи є прапор, щоб сказати ffmpeg, щоб скоротити тримати вихідне відео до довжини вхідного відео?


Виберіть правильну відповідь. Єдиний справжній правильний - той, який написав @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'th потік з A'th входу (обидва починаються з 0, тому [1: 0] є 1-й потік з другого входу, або audiofile.wav вище).

Деталі на сайті: https://www.ffmpeg.org/ffmpeg-filters.html#Examples-68


Слід зазначити, що -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
Євген Рік

Це зворотна відповідь на запитання. ОП просить закінчити відео, коли звук закінчується, відповідь - це додати звукову тишу, якщо звук коротший, ніж відео. Ця відповідь невірна.
Роель Ван де Паар

Це не "протилежне" тому, що просила ОП. ОП хоче, щоб вихідне відео було довжиною вхідного відео, незалежно від довжини аудіодоріжки. Моя відповідь стосується обставини, коли вхідне відео довше аудіофайлу. У OP вже є рішення, коли вхідне відео коротше, ніж аудіофайл, для використання - найкоротший.
мертвий код

12
  • Якщо довжина відео коротша за довжину аудіо - -shortestце те, що ви хочете.
  • Якщо довжина відео більше, ніж довжина аудіо, то жоден прапор не буде таким, як ви хочете.

Немає прапора для автоматизації цього рішення.

EDIT

Натхненний відповідь @ Deadcode, мені потрібно зробити ясно, що «ні один прапор для автоматизації» не є, звичайно , не так, якщо ви готові перекодувати : В цьому випадку йдуть з apadяк це було запропоновано @deadcode.

Якщо ви хочете уникнути перекодування (тобто -c:v copy), відповідь стоїть.

Існує рішення щодо використання ffconcatдемуксера, але для цього потрібно трохи попрацювати:

  • створити файл, що містить тишу в точно такому ж форматі, що і ваш аудіофайл ("silent.wav")
  • створити лаконічний файл "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фільтр без фільтруючого графіка, таким чином, дозволяючи mux без повторного кодування.


@RoelVandePaar Як я вже говорив: Якщо довжина відео коротша, ніж тривалість звуку -shortest, інше скористайтеся цим способом, якщо ви хочете додати тишу без повторного кодування.
Євген Рік

Правильно, пропустив це на огляді. Видалений вхід. Не соромтеся робити те саме.
Роель Ван де Паар

6

Якщо ви знаєте довжину вашого відеофайлу, ви можете досягти цього, використовуючи

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

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


запитання автора хоче зафіксувати аудіофайл, поки відео не закінчено. Це для цього працює?
Рафаель Санчес

@RafaelSanches Ні, він ні.
Zurechtweiser

Автор не хоче вмикати звук. Ця відповідь також є єдино правильною, яка робить те, що просила ОП; закінчити відео, коли закінчується вхідне відео.
Роель Ван де Паар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.