Как извлечь все ключевые кадры из видеоклипа?

10

Я пытаюсь извлечь ключевые кадры из видеоклипа. Я попробовал следующую команду, но она извлекает все кадры.

ffmpeg -vf select="eq(pict_type\,PICT_TYPE_I)" -i 2.flv -vsync 2 -s 73x41 -r 30 -f image2 thumbnails-%%02d.jpeg
Рашед Мустафа
источник

Ответы:

20

Вы можете сделать это проще , используя -skip_frameбез необходимости selectвидеофильтра:

ffmpeg -skip_frame nokey -i 2.flv -vsync 0 -r 30 -f image2 thumbnails-%02d.jpeg
radoh
источник
2
Удивительно, на 20-минутном видео требуется менее 10 секунд по сравнению с более чем 3 минутами с выбранным фильтром!
безумный
Обязательно используйте -threads 1, по сравнению со значением по умолчанию, -threads autoэто делает cropdetectфильтр фильтра ( ffmpeg -threads 1 -skip_frame nokey -i input.mkv -filter:v select='not(mod(n\,20))',cropdetect -an -f null /dev/null) в 2 раза быстрее в моей системе (от 60 до 30 с)!
Genpfault
Я бы не стал использовать skip_frame nokey. Вы даже проверили вывод? В моих файлах и сборке (август 2019 г.) я получаю неправильные метки времени, так как в nokey дает мне предыдущий кадр перед I-кадром, в то время как нефильтрованные / все кадры показывают I-кадр на более поздней временной метке.
JasonXA
Причиной использования @genpfault -threads 1является то, что в противном случае последовательность выходных ключевых кадров может быть выведена не по порядку. Если у вас есть какой -то особый способ решения этой проблемы, вы можете сохранить многопоточность. Кроме того, кажется, что все еще возможно получить неупорядоченные ключевые кадры, даже при использовании -threads 1 , но теперь в этом случае все такие случаи, кажется, сопровождаются / отмечены ошибкой декодера h264 illegal short term buffer state detected.
Гленн Слэйден
12

Пример с использованием selectи scaleфильтры:

ffmpeg -i 2.flv -vf "select=eq(pict_type\,I),scale=73x41" \
-vsync vfr -qscale:v 2 thumbnails-%02d.jpeg

Несколько советов:

  • Фильтры не должны быть перед -iопцией, так как они являются опцией вывода. Я не знаю, откуда именно вы получили команду, но PICT_TYPE_Iне существует - она ​​должна быть I.

  • В scaleфильтре вы можете заменить 73или 41сделать так, чтобы фильтр автоматически вычислял ширину или высоту, чтобы сохранить соотношение сторон: например, scale=73:-1или scale=-1:41. Это предотвращает растяжение или сдавливание, которые могут возникнуть в результате «принудительного» масштабирования.

  • Качество вывода можно контролировать с помощью -qscale:v(или псевдонима -q:v). Эффективный диапазон - линейная шкала от 2 до 31, а более низкое значение - более высокое качество.

  • То, что ваш ffmpegфильтр позволяет, прежде чем входные данные говорят мне, что это может быть устаревшим. Загрузите последнюю статическую сборку для вашей операционной системы или соберите ее самостоятельно в соответствии с руководствами по компиляции, если вышеприведенное не работает.

slhck
источник
1
Если ваша цель - извлечь ключевые кадры без потерь, вы можете попробовать следующее:ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.png
Пельтье
0

если это ошибки :

Опцию vf (установить видеофильтры) нельзя применить к URL-адресу ввода 1508.mp4 - вы пытаетесь применить опцию ввода к выходному файлу или наоборот. Переместите эту опцию перед файлом, которому она принадлежит. Ошибка анализа параметров для входного файла 1508.mp4. Ошибка открытия входных файлов: неверный аргумент

ты можешь сделать это:

ffmpeg -i 263.mp4 -vf select=eq(pict_type\,PICT_TYPE_I)  -vsync 2 -s 480x320 -r 24 -f image2 thumbnails-%05d.jpeg

== --------------------------------------------

«-I» Параметры заранее

Том
источник