Акуратно виріжте відеофайли з командного рядка


22

У мене виникають проблеми з пошуком програми для кліпу, яка може взяти відеофайл (avi, mkv та mp4, бажано) та вирізати дуже короткі кліпи (2-6 секунд) з точністю часу. Я спробував FFmpeg , MEncoder , Avidemux і MP4Box , але всі вони ріжуть на ключових кадрах , які створюють 6+ друге затискачів. Чи є інструмент, який буде перекодувати вхідний файл і вирізати точний час або вирізати неточно, перекодувати, а потім точно вирізати?


Вам, мабуть, доведеться повторно кодувати перед вирізанням, щоб виправити це. Можливо, ви могли б прискорити роботу, спочатку вирізавши навколишні ключові кадри та лише перекодувавши фрагменти.
Ніфле

4
Яку команду FFmpeg ви точно випробували? Я вважаю, що якщо ви декодуєте відео раніше (тобто розміщуєте -ssпараметр після -i ), воно повинно бути більш точним.
slhck

1
Трюк FFmpeg спрацював! Я не усвідомлював, що замовлення так важливе. Це однаково для будь-якого з інших інструментів?
curmil

Відповіді:


23

Вирізання відео за допомогою ffmpeg

Ви можете точно вирізати відео за допомогою FFmpeg. З версії 2.5 це дуже просто. Наприклад, це скоротить 10 секунд, починаючи з 0 хвилин, 3 секунди і 123 мілісекунд.

ffmpeg -ss 00:00:03.123 -i input.mp4 -t 10 -c:v libx264 -c:a copy out.mp4

Положення і час можуть бути або в секундах, або у hh:mm:ss[.xxx]формі.

Зауважте, що в цих прикладах відео буде перекодовано за допомогою кодера x264 ; аудіо копіюється.

Ви також можете використовувати -toзамість того, -tщоб вказати кінцеву точку замість тривалості. У цьому випадку, однак, -toце рівнозначно -t, оскільки, поставивши -ssперед -i, ffmpeg спочатку прагне до цієї точки, а потім почне виводити.

Дивіться також запис Вікі шукає .


Точне різання для старих ffmpegверсій

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

ffmpeg -i input.mp4 -ss 00:00:03.123 -t 10 -c:v libx264 -c:a copy out.mp4

Тут -toі -tповодяться по-різному. -t 10створив би довгий десять секунд кліпу, тоді як -to 10створив би кліп, який триває сім секунд.


Замість цього -c:v libx264 -c:a libfaacя думаю, що ми можемо використовувати, -acodec copy -vcodec copyщо повідомляє ffmpeg просто для виявлення та використання тих же кодеків, що і вихідний файл. Чи може хтось підтвердити?
Баодад

2
@Baodad Можна, але це точно не виріжеться . Під час копіювання біт-потоків відео / аудіо ffmpeg потрібно починати з ключового кадру, який може бути розміщений на кожній секунді або навіть далі один від одного.
slhck

Як подолати помилку "Невідомий кодер" libfaac ""?
Дуг

@Doug Виберіть, наприклад, інший кодер -c:a aac -strict experimental. Це найпростіше рішення.
slhck

1

Єдиний інструмент командного рядка Linux, який я знайшов досі, який може вирізати в точному кадрі (або, з точністю кадру), є melt( sudo apt-get install melt).

Скажімо, у вас є inputvid.mp4- спершу перевірте його параметри кодування за допомогою слова say ffmpeg(тут я просто кажу, що хочу знову зашифрувати його -f mp4, але як файл, /dev/nullтак що вихід відкидається; я перенаправляю stderr, щоб я міг проглядати його - зверніть увагу на середині , підкаже команда, і вам слід відповісти за yдопомогою ENTER, тому процес триває та скидає корисну інформацію; це з ffmpeg 3.3.3 на Ubuntu 14):

ffmpeg -i inputvid.mp4 -f mp4 /dev/null 2>&1 | grep 'Stream\|encoder'
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, bt709), 640x360 [SAR 1:1 DAR 16:9], 389 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 95 kb/s (default)
y
File '/dev/null' already exists. Overwrite ? [y/N] Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
    encoder         : Lavf57.71.100
    Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p(progressive), 640x360 [SAR 1:1 DAR 16:9], q=-1--1, 23.98 fps, 24k tbn, 23.98 tbc (default)
      encoder         : Lavc57.89.100 libx264
    Stream #0:1(und): Audio: aac (LC) ([64][0][0][0] / 0x0040), 44100 Hz, stereo, fltp, 128 kb/s (default)
      encoder         : Lavc57.89.100 aac

Гаразд, тому ми можемо бачити ffmpegвибрані libx264та aacкодери для цього відео; то ми можемо ввести це для melt:

melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac vcodec=libx264

.... і meltбуде розрізано на частини між кадрами 7235 і 7349 в новий файл cut.mp4. Потім, щоб перевірити cut.mp4правильність циклів, використовуйте meltще раз, щоб відтворити його двічі - і відтворити його у вікно SDL:

melt cut.mp4 cut.mp4 -consumer sdl

... і ось що ffmpegбачить цей файл:

ffmpeg -i cut.mp4 -f mp4 /dev/null 2>&1 | grep 'Stream\|encoder'    encoder         : Lavf54.20.4
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 526 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 182 kb/s (default)
y
File '/dev/null' already exists. Overwrite ? [y/N] Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
    encoder         : Lavf57.71.100
    Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 640x360 [SAR 1:1 DAR 16:9], q=-1--1, 23.98 fps, 24k tbn, 23.98 tbc (default)
      encoder         : Lavc57.89.100 libx264
    Stream #0:1(und): Audio: aac (LC) ([64][0][0][0] / 0x0040), 48000 Hz, stereo, fltp, 128 kb/s (default)
      encoder         : Lavc57.89.100 aac

Налаштування кодування відео, cut.mp4здається, ідентичні, за inputvid.mp4винятком того, що бітрейт відео змінено з 389 кб / с на 526 кб / с, а також параметри кодування аудіо майже однакові, за винятком швидкості дискретизації, зміненої з 44100 до 48000 Гц; хоча це можна регулювати за допомогою:

melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac ar=44100 ab=95k vcodec=libx264 vb=389k

... проте навіть при цьому остаточний бітрейт для мене закінчується 337 кб / с. Тим не менш, скорочення циклу добре (і це включає аудіо), коли відтворюється в циклі, так що я думаю, що це дійсно кадра точно ...


1
meltперекодує відео, і воно використовує бібліотеки FFmpeg під ним. Якщо ви дозволите повторне кодування, ffmpeg може створити той же вихід.
Gyan

Дякую @Gyan - не знав про це (особливо, що meltвикористовує бібліотеки FFmpeg), добре знати!
sdaau

Розплав виглядає простіше у використанні, ніж ffmpeg, все, що нам потрібно, це спосіб вказати час, особливо час у hr, min, sec формі або hr, min, sec, ms, який перетворює їх у потрібний кадр.
барлоп

0

Як сказав Баодад у коментарях (я публікую, тому що це не легко знайти, якщо ви швидко прочитаєте), кращим підходом є автоматичне виявлення кодувальників аудіо / відео за допомогою ffmpeg, так що:

ffmpeg -ss 00:05:17.18 -i in.mp4 -t 00:06:29.10 -acodec copy -vcodec copy out.mp4 
  • початок @ 00: 05: 17.18
  • input = in.mp4
  • зупинка @ 00: 06: 29.10
  • вихід = вихід.mp4

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