Витяг "одного з кожні 10 кадрів" у відео, використовуючи VLC або FFmpeg


12

Я намагаюся витягти "рівно 1 кадр на кожні 10" кадрів відео (тобто витяг 1, залиште 9, потім повторіть) для наукових цілей. Відео має 105 кадрів, 3,5 секунди, 29,97 кадрів в секунду (h.264, .mov, вироблений Nikon D3100).

Я завантажив його сюди .

VLC

Знизу команда повинна створити 10 кадрів, але вона створює лише 6 зображень. Я пробував різні співвідношення сцен, і жоден з них не створював правильну кількість кадрів (навіть не близьких до правильних).

vlc 1.mov --video-filter=scene --vout=dummy --scene-ratio=10 --scene-prefix=img- --scene-path=. vlc://quit

Скажіть, будь ласка, хто в чому проблема?

FFmpeg

FFmpeg, здається, не має команди саме для моєї мети. Нижче команда витягує 3 кадри з кожної секунди, але оскільки FPS не точно 30 (швидше 2,97), це не дасть правильних результатів для мене.

Крім того, навіть FFmpeg не видає правильну кількість кадрів навіть з цією командою. За 3,5 секунди відео очікую не більше 10 кадрів, але я отримую 12 кадрів!

ffmpeg -i 1.mov -y -an -sameq  -r 3 -f image2 -vcodec mjpeg %03d.jpg 

Як я можу досягти того, що хочу?


1
BTW -sameqне робить те, що ви, напевно, вважаєте, що це робить, і був видалений із поточної версії (справжній ffmpeg, тобто я не впевнений, чи є він у підробці ffmpeg Ubuntu). Використовуйте замість qscale.
стиб

Відповіді:


21

Виберіть 1 кадр з кожні 10 кадрів

Для цього можна скористатися selectвідеофільтром ffmpeg:

ffmpeg -i input.mov -vf "select=not(mod(n\,10))" -vsync vfr -q:v 2 img_%03d.jpg
  • Для виведення JPG ви можете змінювати якість -q:v. Ефективний діапазон - від 2 (найкраща якість) до 31 (найгірша якість). Ця опція вам не потрібна, якщо ви хочете вивести її на PNG.

  • Цей вихід буде img_001.jpg, img_002.jpg, img_003.jpgі т.д.


Виглядає дуже цікаво, але, схоже, потрібна певна версія або щось додатково складене. Я отримую " unrecognized option '-filter:v'" з "FFmpeg версія SVN-r0.5.1-4: 0.5.1-1ubuntu1.3" (--enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable -libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib - unisable-stripping --disable-vhook --enable-runtime-cpudetect - -enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared
відключити

Я також не можу запустити команду і отримати таку помилку на ffmpeg windows N-35709-g7d531e8: [select @ 017EBB00] [Eval @ 0022DC08] Відсутня ')' або занадто багато аргументів у 'mod (n \, 10))' [ select @ 017EBB00] Помилка під час розбору виразу 'не (mod (n \, 10))' Помилка ініціалізації фільтра 'select' з аргументами 'не (mod (n \, 10))' Помилка відкриття фільтрів!
wmac

@mivk Ваша версія FFmpeg з репо Ubuntu не має можливостей фільтрації. Вам доведеться скласти FFmpeg .
llogan

1
@wmac Я думаю, що Windows не любить єдиних цитат. Змініть їх в подвійні лапки: ".
llogan

1
@LordNeckbeard, дякую, вона працює правильно і вирішила всю проблему. Я дуже ціную вашу допомогу.
wmac

4

Найважливішим аспектом у вашому запитанні є той факт, що відео використовує 29,97 кадрів в секунду, а не 30. Pesky NTSC.

У будь-якому випадку, я думаю, що найпростіше було б просто витягнути кожен кадр , а потім видалити ті, які вам не потрібні:

ffmpeg -i 1.mov -y -f image2 -c:v mjpeg %03d.jpg

Потім видаліть ті, які вам не потрібні. Оскільки кожен десятий кадр закінчиться символом a 1.jpg, ми можемо просто взяти всі інші…

find . -maxdepth 1 -not -iname "*1.jpg"

… І коли ви впевнені, що це саме те, що ви хочете видалити:

find . -maxdepth 1 -not -iname "*1.jpg" -exec rm '{}' \;

Якщо ви можете використовувати mencoder, ви можете спробувати framestepваріант, як пояснено в документації , як framestep=10у вашому випадку. Я особисто не міг її встановити / спробувати.


1
Дуже дякую за допомогу та вашу редакцію. Я спробував mencoder і навіть у цього є проблема! Я думаю, це має щось спільне або з кодеком, або з контейнером. ffmpeg витягує рівно 105 кадрів із командою нижче: ffmpeg -i 1.mov -y -an -sameq -f image2 -vcodec mjpeg% 03d.jpg, але mencoder витягує лише 90 кадрів !!! з командою нижче: mplayer -vo png 1.mov Використання frametep = 10 також створює неправильну кількість кадрів. Я вражений тим, як усі троє (ffmpeg, vlc та mencoder) не в змозі правильно виконати таке просте завдання. Я надіслав звіт про помилку на веб-сайт VLC. Знову дякую.
wmac

0

Якби ви спочатку перетворили відео на серію необроблених зображень rgb24 або rgb32, можливо, ви могли б отримати потрібну кількість кадрів, оскільки в оригінальному вигляді, здається, є незвичні типи кадрів, які можуть взагалі не бути зображеннями ?? ?

У оригінальних лазерних дисках все відео складалося з серії зображень з окремими кадрами від 1 до 100 000 і більше, і подібне - це дійсно правильний спосіб встановити базову лінію для майбутніх перетворень чи маніпуляцій.

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

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

У форматі лазерного диска частоту кадрів просто диктує будь-яка швидкість подання послідовних зображень і ніяким чином не контролюється самими зображеннями.

FFMPEG може взяти урок з науки замість мистецтва для правильного поводження та відображення зображень будь-якого типу. Або, можливо, сама індустрія AV. Промисловість дійсно потребує вдосконалення можливостей обладнання та використання необроблених даних, що вимагає великої кількості пам'яті / зберігання. Ніщо не перевершує необроблені дані для точності та точності.

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