在规定的时间Qt中获取视频帧

car*_*rvo 2 c++ video qt qtmultimedia qt5.7

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

QMediaPlayer* player = new QMediaPlayer;
...
player->play();
player->setPosition(20000);
player->pause();
Run Code Online (Sandbox Code Playgroud)

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

Jee*_*eet 5

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

项目层面

  1. QT + =多媒体

代码等级

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

上面提到的示例应用程序可以在这里找到

(应用程序屏幕截图)

在此处输入图片说明

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