Це неможливо зробити в одній команді. Однак, якщо ви працюєте на 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
папку.
concatdec_select
може зробити все ваші вимоги в одному кроці superuser.com/a/1020455/15252