Извлечение «одного из каждых 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 

Как я могу добиться того, чего хочу?

wmac
источник
1
КСТАТИ -sameqне делает то, что вы, вероятно, думаете, что он делает, и был удален из текущей версии (реальный ffmpeg, то есть я не уверен, что это в Ubuntu поддельные ffmpeg). Вместо этого используйте qscale.
24

Ответы:

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и т.д.

llogan
источник
Выглядит очень интересно, но, кажется, требует какой-то конкретной версии или чего-то дополнительного скомпилированного. Я получаю " 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 --disable-stripping --disable-vhook --enable-runtime-cpudetect - -enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static)
mivk
Я также не могу выполнить команду и получить следующую ошибку в ffmpeg windows N-35709-g7d531e8: [select @ 017EBB00] [Eval @ 0022DC08] Отсутствует ')' или слишком много аргументов в 'mod (n \, 10))' [ select @ 017EBB00] Ошибка при разборе выражения «not (mod (n \, 10))» Ошибка инициализации фильтра «select» с аргументами «not (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

Затем удалите те, которые вам не нужны. Так как каждый десятый кадр будет заканчиваться на 1.jpg, мы можем просто взять все остальные ...

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

... и как только вы убедитесь, что это те, которые вы хотите удалить:

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

Если вы можете использовать mencoder, вы можете попробовать framestepвариант, как описано в документации , как framestep=10в вашем случае. Я лично не мог установить / попробовать это все же.

slhck
источник
1
Большое спасибо за вашу помощь и ваши изменения. Я попробовал mencoder, и даже у этого есть проблема! Я предполагаю, что это как-то связано с кодеком или контейнером. ffmpeg извлекает ровно 105 кадров с помощью следующей команды: ffmpeg -i 1.mov -y -an -sameq -f image2 -vcodec mjpeg% 03d.jpg, но mencoder извлекает только 90 кадров !!! с помощью команды ниже: mplayer -vo png 1.mov Использование framestep = 10 также дает неправильное количество кадров. Я шокирован тем, что все трое (ffmpeg, vlc и mencoder) не могут правильно выполнить такую ​​простую задачу. Я отправил сообщение об ошибке на сайт VLC. Еще раз спасибо.
Wmac
0

Если бы вы сначала конвертировали видео в серию необработанных изображений rgb24 или rgb32, возможно, тогда вы могли бы получить правильное количество кадров, поскольку в оригинальной форме, кажется, есть необычные типы кадров, которые могут вообще не быть изображениями ?? ?

В оригинальных лазерных дисках все видео состояло из серии изображений с отдельными номерами кадров от 1 до 100 000 или более, и, таким образом, это действительно правильный способ установить базовую линию для будущих преобразований или манипуляций.

Индустрия перешла к этой странной идее сжатия просто для того, чтобы уменьшить количество денег и исказить истинные научные формы обработки чисел.

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

С форматом лазерного диска частота кадров просто определяется тем, с какой скоростью вы представляете последовательные изображения, и не контролируется самими изображениями.

FFMPEG может извлечь урок из науки вместо искусства для правильной обработки и отображения изображений любого рода. Или, возможно, сама индустрия AV. Промышленность действительно нуждается в улучшении возможностей оборудования и использовании необработанных данных, которые требуют много памяти / хранилища. Ничто не сравнится с необработанными данными для точности и аккуратности.

Aluetta
источник