Об’єднайте сегменти з різних відео ffmpeg


2

Чи можу я використовувати ffmpeg для створення одного відео, яке займає різні сегменти з різних відео?

1.webm, 2.webm, 3.webm, 4.webm 

Це мої 4 відеофайли. Я хочу 10 секунд від кожного відео. Сегменти вказуються мною.

ffmpeg -i 1.webm -1 2.webm -i 3.webm -i 4.webm -ss 00:00:00 -t 10 -ss 00:00:10  \
-t 10 -ss 00:00:20 -t 10 -ss 00:00:30 -t 10;

Сказане не є реальною командою, яка працює. Чи можу я отримати щось подібне програмно?


може пізно до партії , але нова версія FFmpeg має розширений фільтр під назвою concatdec_selectможе зробити все ваші вимоги в одному кроці superuser.com/a/1020455/15252
EST

Відповіді:


2

Це неможливо зробити в одній команді. Однак, якщо ви працюєте на Linux і маєте Bash (або подібні) в якості оболонки, все, що потрібно, - це дві команди. Зверніть увагу, що це працює лише в тому випадку, якщо всі відео мають абсолютно однакові кодеки для відео та аудіо та часову базу (fps, тощо).

1. Створіть список відеозаписів і час початку

Спочатку потрібно скласти список редагування, що містить наступне. Назвемо це videos:

1.webm 00:00:00
2.webm 00:00:10
3.webm 00:00:20

Зауважте, що це не підтримує назви відео з пробілами.

2. Розділіть відео

Тепер ми створимо тимчасову папку для зберігання наших менших відео. Давайте назвемо це tmp. Потім ви можете розділити свої файли так:

while read video time; do ffmpeg -i $video -ss $time -t 10 -c copy tmp/$video; done < videos

Тут -t 10означає, що ми відрізаємо 10 секунд від відео, починаючи з часової позначки, визначеної -ss. Ви також можете використовувати -toзамість того, -tщоб вирізати його до певного моменту.

Якщо у всіх відео вхідних відео є різні кодеки для відео та аудіо, вам потрібно перекодувати відео в цей момент. Для цього слід замінити -c copyчастину конкретними налаштуваннями відео- та аудіокодеків, наприклад, -c:v libx264 -c:a libfaacдля відео та аудіо H.264 / AAC.

3. Об’єднайте відео

Тепер, використовуючи concatпротокол, ми можемо об'єднати файли назад разом:

ffmpeg -f concat -i <(for f in tmp/*.webm; do echo "file '$f'"; done) -c copy output.webm

Це все, що вам потрібно. Це працює, динамічно створюючи файл конкатенації на льоту. В іншому випадку вам доведеться створити його вручну в відповідно з concatдокументацією .

Нарешті ви можете почистити свою tmpпапку.


Я щойно помітив, що концетатні відео не відтворюються. Вони грають на медіаплеєрі в ubuntu, але не можуть грати на vlc на одній машині. Будь-яка причина, яку ви могли подумати, чому це відбувається?
Pavan K

Це може статися. Якщо оригінальні відео мають дещо інші параметри кодування, конкатенація може призвести до невідтворюваного файлу. Чи можете ви спробувати обміняти -c copyостанню команду на -c:v libvpx -b:v 1M -c:a libvorbisта побачити, чи створює це відтворюваний файл?
slhck

Але, вказавши -b: v, він змінить бітрейт, який я хотів би не торкатися. дозвольте спробувати інші варіанти
Pavan K

Ну, за допомогою цієї команди ви все-таки перекодуєте все замість копіювання потоків, тому бітрейт 1MBit / s був лише прикладом для налагодження.
slhck

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