Без загрузки, 100% локально, без аккаунта

Статья

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

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

Кадры и частота кадров

Видеофайл, это последовательность неподвижных изображений, отображаемых достаточно быстро для создания иллюзии движения. Количество изображений, показываемых в секунду,, это частота кадров, выраженная в fps. Распространённые значения: 24 fps для кино, 25 fps для PAL-вещания, 30 fps для веб-видео и 60 fps для игрового контента. При 24 fps двухчасовой фильм содержит около 172 800 отдельных кадров. Каждый кадр соответствует отдельному моменту времени; извлечение одного замораживает этот момент как отдельное изображение. Частота кадров также определяет, сколько кадров вы получаете за секунду видео при пакетном извлечении: при 30 fps извлечение каждого кадра из одной минуты видео даёт 1800 изображений, что зачастую намного больше, чем нужно. Извлечение с более низкой частотой кадров или каждого N-го кадра в инструментах, которые это поддерживают, практичный способ сократить этот объём при сохранении охвата всей продолжительности.

Временная полоска, показывающая 24 отдельных кадра в секунду видео с номером кадра и временной меткой, видимыми под каждым кадром.

Ключевые кадры и интерполированные кадры

Современные видеокодеки не хранят каждый кадр как полное изображение. Они используют три типа кадров для экономии места. I-frame, также называемый ключевым кадром,, это полное, самодостаточное изображение. P-frame хранит только пиксели, изменившиеся с момента последнего I-frame или P-frame. B-frame хранит изменения относительно как предыдущего кадра, так и будущего, требуя кадров с обеих сторон для восстановления. Поскольку P-frame или B-frame неполны сами по себе, их декодирование требует окружающих опорных кадров. Если эти опорные кадры содержат размытие движения или переход, восстановленное изображение наследует это размытие. I-frame, напротив, декодируется независимо. Он всегда чёткий, поскольку не заимствует ничего от соседей. При извлечении кадра для использования в качестве миниатюры попадание на I-frame даёт наилучший возможный результат. Большинство кодеков размещают I-frame при смене сцены, что является естественно чёткими отправными точками.

Выбор подходящего момента

Даже хорошо декодированный I-frame может стать плохой миниатюрой, если захваченный момент не является удачным. Несколько факторов снижают качество миниатюры. Размытие движения возникает, когда камера или объект быстро движутся во время экспозиции кадра; результирующий смаз делает кадр мягким, даже если декодирование было чистым. Переходные кадры, захваченные в середине растворения или затухания, содержат два перекрывающихся изображения и редко работают как отдельные картинки. Недоэкспонированные или переэкспонированные кадры, распространённые в начале сцены до стабилизации автоэкспозиции, теряют детали в тенях или светах. Лучшие кадры для миниатюр получаются из моментов ясного действия или выражения, хорошего освещения и стабильной камеры. Прокрутка видео в плеере с отображением точных временных меток позволяет определить эти моменты до их извлечения. Кадр, хорошо выглядящий при паузе в плеере, как правило, будет хорошо выглядеть и как экспортированное изображение.

Видеоплеер, поставленный на паузу на хорошо освещённом, стабильном кадре объекта в середине действия, с временной меткой, отображаемой в углу.

Экспорт: разрешение, формат и каждый N-й кадр

При извлечении кадра экспортированное изображение должно соответствовать нативному разрешению видео. Увеличение вносит артефакты интерполяции; уменьшение отбрасывает пиксели, которые могут понадобиться. Видео 1080p создаёт изображения 1920x1080 пикселей, а видео 4K, 3840x2160. По формату PNG сохраняет каждый пиксель точно и является правильным выбором, когда нужна максимальная чёткость для редактирования или дальнейшего масштабирования. JPEG меньше по размеру и подходит для предварительного просмотра или отправки, но вносит артефакты сжатия вокруг чётких краёв. При создании контактного листа, сетки небольших репрезентативных кадров, охватывающих всю продолжительность видео,, стандартный подход заключается в извлечении с фиксированной частотой кадров, а не в извлечении каждого кадра подряд: запрос 1 кадра в секунду из источника с 30 fps даёт одно изображение на каждую секунду видео, а более высокая частота, например 5 или 10 fps, даёт более плотный набор для детального изучения. Точная частота зависит от того, сколько деталей вам нужно по сравнению с тем, сколькими изображениями вы хотите управлять.

Локальная работа с video-extract-frames

Инструмент video-extract-frames на Sunasty декодирует ваше видео полностью внутри браузера, используя FFmpeg, скомпилированный в WebAssembly. Вы перетаскиваете файл, выбираете частоту от 1 до 30 кадров в секунду, выбираете PNG или JPEG, и инструмент декодирует кадры с этой частотой в памяти браузера и предлагает результаты как отдельные загрузки, с ограничением в 300 кадров за один запуск. Ваш видеофайл никогда не покидает ваше устройство. Ни байта не отправляется на сервер ни в какой момент процесса. Это важно для видеозаписей с личным или конфиденциальным содержимым: семейная съёмка, интервью или исходный материал до монтажа. Браузер загружает видео в виртуальную файловую систему в оперативной памяти, запускает декодирование FFmpeg и возвращает изображения вам. Компромисс: декодирование выполняется программно на вашем процессоре, а не специализированным аппаратным обеспечением, поэтому длинное видео с высоким разрешением займёт больше времени, чем в нативном приложении. Для извлечения нескольких кадров или создания контактного листа из короткого клипа скорость вполне практична.

Инструменты из этой статьи

Частые вопросы

Почему извлечённый кадр выглядит размытым?

Наиболее распространённая причина, попадание на P-frame или B-frame в момент движения. Эти кадры хранят различия, а не полные изображения, и размытие движения в исходном видео переносится в декодированный кадр. Попробуйте извлечь ближайший I-frame, соответствующий смене сцены или периодическому ключевому кадру, для более чёткого результата.

Экспортировать кадры в PNG или JPEG?

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

Как создать контактный лист из видео?

Выберите частоту кадров достаточно низкую, чтобы получить управляемое количество кадров, вместо одной временной метки. Для двухминутного клипа 1 кадр в секунду даёт около 120 кадров, чего достаточно, чтобы выбрать хорошую сетку; в любом случае вывод ограничен 300 кадрами за один запуск. Более низкой частоты, чем 1 fps, сегодня нет, поэтому для более разреженной сетки извлекайте с частотой 1 fps и оставляйте только нужные кадры для итоговой сетки.