Извлечение ключевых кадров из видео

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

Ответ 1

Используя 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

Ответ 2

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

Ответ 3

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

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

Ответ 4

Решение 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

Ответ 5

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

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

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