Получение видеокадра за предоставленное время Qt

Что я хочу сделать, так это получить видеокадр в какое-то время (например, через 20 секунд).
Я знаю, что могу сделать что-то вроде этого — перемотать видео и приостановить его:

QMediaPlayer* player = new QMediaPlayer;
...
player->play();
player->setPosition(20000);
player->pause();

Но есть ли более элегантное решение (мне кажется, что это взломать, так как я не нужно целое видео, но только кадр)?

2

Решение

Следующие шаги могут помочь вам захватить кадр из видеофайла.

Уровень проекта

  1. QT + = мультимедиа

Уровень кода

  1. Инициировать объект QMediaplayer (QMediaPlayer (родитель QObject, QMediaPlayer :: VideoSurface)
  2. установите QMediaplayer.setVideoOutput в (Подкласс QAbstractVideoSurface)
  3. Подкласс QAbstractVideoSurface должен повторно реализовать методы, которые поддерживаютсяPixelFormats, isFormatSupported, start, подарок
    4. Из подарок Метод мы можем получить буфер изображения каждого кадра
  4. Загрузите видеофайл с помощью QMediaplayer
  5. setMute = true (аудио)
  6. Установите необходимую позицию в миллисекундах для объекта QMediaplayer
  7. Метод начала игры
  8. От подарок метод конвертирует полученный буфер данных в QImage, а затем в QPixmap (при необходимости).
  9. Получив растровое изображение, используйте его для загрузки в виджет (пример: в QLabel)
  10. Немедленно приостановите воспроизведение видеофайла (если вам нужно захватить какой-то другой кадр. Другой мудрый стоп () вместо pause ()). Это можно сделать с помощью сигнального слота из объекта подкласса (QAbstractVideoSurface) в объект QMediaPlayer
  11. Когда закончите, вызовите метод stop подкласса QAbstractVideoSurface, а затем QMediaplayer

Выше приведен пример приложения Вот

(Снимок экрана приложения)

введите описание изображения здесь

Открыть видеофайл: найдите и выберите видеофайл
Ползунок: выберите нужную позицию
Захват: захват изображения и просмотр в QLabel
Сохранить: сохранить захваченное изображение

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]