Извлечение ключевого кадра из видео - PullRequest
10 голосов
/ 30 января 2012

Мне нужно Извлечь Ключевые кадры из Video / Stream. Так есть какая-либо стандартная реализация. Я использую открытое резюме. (В настоящее время я извлекаю кадры каждую секунду, что медленнее, мне нужно улучшить производительность.) Так что, если кто-то оптимизировал реализацию, пожалуйста, ответьте здесь.

Ответы [ 5 ]

16 голосов
/ 02 марта 2012

Используя ffmpeg, вы можете извлечь все ключевые кадры, используя следующий код:

ffmpeg -vf select="eq(pict_type\,PICT_TYPE_I)" -i yourvideo.mp4 -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg

Что следует за -vf в командной строке ffmpeg - это описание Filtergraph. Фильтр выбора выбирает кадры для передачи на выходе. Константа фильтра - «pict_type» и значение «PICT_TYPE_I». Таким образом, ffmpeg передает только ключевые кадры на выход.

-vsync 2 не позволяет ffmpeg генерировать более одной копии для каждого ключевого кадра.

-f image2 записывает видеокадры в файлы изображений. Выходные имена файлов задаются шаблоном, который может использоваться для создания последовательно пронумерованных серий файлов. Шаблон может содержать строку "% d" или "% 0Nd".

Ссылка: http://www.videoproductionslondon.com/blog/scene-change-detection-during-encoding-key-frame-extraction-code

7 голосов
/ 31 января 2012

Я предполагаю, что ключевой кадр - это кадр, представляющий контент, сильно отличающийся от предыдущих (это не формальное определение, но оно подходит). Возьмите кадры i и i + 1 . Используйте cv2.absDiff , чтобы вычислить разницу между кадрами, и cv2.sumElems , чтобы получить сумму всех разностей пикселей. Сделайте это для всех кадров i . Это уменьшит ваш видеопоток до одномерного сигнала . Найдите в этом сигнале peaks и выберите ключевые кадры, соответствующие этим пикам. Чтобы найти пики, выберите пороговое значение для этого сигнала либо вручную, найдя кадр, который вы считаете ключевым, и допустив, чтобы его ошибка была пороговым значением ошибки, либо автоматически используя статистику (например, любой кадр i + 1, где ошибка превышает 1 стандартное отклонение от средняя ошибка).

2 голосов
/ 14 ноября 2014

Если что-то не так с приведенным выше кодом, попробуйте этот порядок аргументов.

ffmpeg -i yourVideo.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg
1 голос
/ 13 февраля 2014

Решение ffmpeg должно работать хорошо.

Для тех, кто сталкивается с проблемами с фильтром выбора 'eq (pict_type \, PICT_TYPE_I)', вы можете попробовать использовать фильтр как 'eq (pict_type \, I)».Это какое-то время было сломано, поэтому некоторые версии ffmpeg могут не распознавать константу.Исправление можно увидеть здесь .

Последняя команда, которая сработала для меня, наконец, была:

ffmpeg -vf select='eq(pict_type\,I)' -i yourVideo.mp4 -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg
0 голосов
/ 07 июня 2017

Вы можете использовать ffprobe для извлечения ключевых кадров.Это инструмент в ffmpeg.

Используйте команду:

ffprobe in.mp4 -select_streams v -show_entries frame=key_frame,pkt_pts_time -of csv=nk=1:p=0 | findstr "1,"
...