在提供的时间Qt中获取视频帧

Getting video frame in provided time Qt

我想做的是在某个时间(例如20秒)获取视频帧。 我知道我可以做这样的事情 - 倒回视频并暂停它:

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

但是有没有更优雅的解决方案(这对我来说似乎是一个黑客,因为我不需要整个视频,但有时只需要一帧)?

以下步骤可能会帮助您从视频文件中捕获帧。

项目级别

  1. QT += 多媒体

代码级别

  1. 初始化QMediaplayer对象(QMediaPlayer(QObject parent, QMediaPlayer::VideoSurface)
  2. 将QMediaplayer.setVideoOutput设置为(QAbstractVideoSurface的Subclass)
  3. QAbstractVideoSurface 的
  4. Subclass 应该重新实现方法 supportedPixelFormats、isFormatSupported、start、present
    4.Frompresent方法我们可以得到每一帧的图像缓冲区
  5. 使用 QMediaplayer 加载视频文件
  6. setMute = true(音频)
  7. 设置 QMediaplayer 对象所需的位置(以毫秒为单位)
  8. 开始播放方法
  9. present方法将接收到的数据缓冲区转换为QImage,然后再转换为QPixmap(如果需要)。
  10. 获得像素图后,使用它加载小部件(例如:在 QLabel 中)
  11. 立即暂停视频文件播放(如果您需要捕获其他帧。其他明智的做法是停止()而不是暂停())。这可以使用从 subclass 的对象 (QAbstractVideoSurface) 到 QMediaPlayer 对象
  12. 的信号槽来完成
  13. 完成后,调用QAbstractVideoSurface的sub class的stop方法,然后调用QMediaplayer

可以找到上述示例应用程序 here

(应用程序屏幕截图)

打开视频文件:浏览并select一个视频文件
滑块:select你想要的位置
捕获:捕获图像并在 QLabel
中查看 保存 : 保存拍摄的图像