Як об'єднати кліпи з одного відео з ffmpeg


15

У мене довге відео з різними сценами в ньому. Я хочу витягнути і об'єднати 2 сцени з відео (які не починаються на I-кадрі) за допомогою ffmpeg 2.1.4.

Для аргументації скажіть, що я хочу 5 секунд з 01:00 та 02:00.

Я можу це зробити:

ffmpeg -ss 01:00 -i in.mkv -ss 02:00 -i in.mkv -filter_complex "
  [0:v]select='lt(t,5)'[v0];
  [0:a]aselect='lt(t,5)'[a0];
  [v0][a0][1:v][1:a]concat=n=2:v=1:a=1
" -c:a libvorbis -t 10 out.mkv

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

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

Я не можу знайти фільтр, який обрізає довжину пари. Чи існують вузли фільтру, які відповідають -tабо -ssпараметрам?

Відповіді:


16

фільтр-фільтр

Цей спосіб найкращий, якщо вам потрібно виконати додаткову фільтрацію:

Використовуйте trim, atrim, setpts, asetpts, і concatфільтри:

ffmpeg -i input -filter_complex \
"[0:v]trim=60:65,setpts=PTS-STARTPTS[v0]; \
 [0:a]atrim=60:65,asetpts=PTS-STARTPTS[a0]; \
 [0:v]trim=120:125,setpts=PTS-STARTPTS[v1];
 [0:a]atrim=120:125,asetpts=PTS-STARTPTS[a1]; \
 [v0][a0][v1][a1]concat=n=2:v=1:a=1[out]" \
-map "[out]" output.mkv
  • setptsі asetptsзапобігатиме ривковим результатам через проблеми із часовою міткою презентації.

  • Обов’язково використовуйте останню версію. Див. Сторінку завантаження FFmpeg для посилань на збірки для Windows, OS X та Linux.


concat demuxer

Інший метод полягає у створенні сегментів окремо і потоковому їх копіюванні замість перекодування (щоб заощадити час та якість) та з'єднати їх із контуром деміксером .

$ ffmpeg -ss 60 -i input -t 5 -codec copy clip1.mkv
$ ffmpeg -ss 120 -i input -t 5 -codec copy clip2.mkv
$ echo "file 'clip1.mkv'" > concat.txt
$ echo "file 'clip2.mkv'" >> concat.txt
$ ffmpeg -f concat -i concat.txt -codec copy output.mkv

2
А, дякую. обробка - це те, чого мені не вистачало. Однак потрібно дістати дуже багато часу, щоб визначити зсув часу, який я вказую, як би розшифровуючи все, що залежить від нього. Також у частині виходу бракувало звуку. Щоб виправити, я вказав один і той же вхід кілька разів з -ss, а потім використовуйте обрізку для обрізання відео. У цьому випадку вам не потрібні септи, оскільки ss встановлює бали в 0. Це, здавалося, спрацювало і не мало дивних випадкових пауз під час кодування. Що стосується копіювання потоків, я раніше це намагався. Він починається на попередньому I-кадрі, тому ви отримуєте іншу частину фільму, ніж ту, яку ви хотіли.
перетирали

Скажіть, будь ласка, на моє запитання, це схоже на це. video.stackexchange.com/questions/18247/…
Ефтехарі

Цікаво, що -filter_complexпрацює, але concatфайли - ні. Перше відео виглядає чудово, але якість 2-го жахливе. Зверніть увагу, я скопіював ці команди точно для обох (крім вхідного файлу).
bobmarksie

7

Це має працювати швидше ...

ffmpeg -ss 1:00 -t 5 -i in.mkv -ss 2:00 -t 5 -i in.mkv \
  -filter_complex "[0][1]concat=n=2:v=1:a=1" \ 
  out.mkv

На виході не потрібно вказувати -t. Не потрібно розділяти аудіо та відео перед конкатом.


1
Для цього використовується фільтр concat, який потребуватиме перекодування. Користувач може цього або не бажати.
llogan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.