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

时间:2016-07-19 21:14:21

标签: c++ qt video qtmultimedia qt5.7

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

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

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

1 个答案:

答案 0 :(得分:4)

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

项目级别

  1. QT + =多媒体
  2. 代码级别

    1. 启动QMediaplayer对象(QMediaPlayer(QObject parent,QMediaPlayer :: VideoSurface)
    2. 将QMediaplayer.setVideoOutput设置为(QAbstractVideoSurface的子类)
    3. QAbstractVideoSurface的子类应重新实现supportedPixelFormats,isFormatSupported,start, present 方法 4.从现在方法,我们可以获得每个帧的图像缓冲区
    4. 使用QMediaplayer加载视频文件
    5. setMute = true(audio)
    6. 为QMediaplayer对象设置所需的位置(以毫秒为单位)
    7. 开始播放方法
    8. 当前方法将接收到的数据缓冲区转换为QImage,然后转换为QPixmap(如果需要)。
    9. 获得pixmap后,使用它加载小部件(例如:在QLabel中)
    10. 立即暂停播放视频文件(如果需要捕获其他帧。其他明智的停止()而不是暂停())。这可以使用从子类的对象(QAbstractVideoSurface)到QMediaPlayer对象的信号槽来完成
    11. 完成后,调用QAbstractVideoSurface子类的stop方法然后调用QMediaplayer
    12. 上面的示例应用程序可以找到here

      (应用程序屏幕截图)

      enter image description here

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