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

C++ 在提供的时间内获取视频帧,c++,qt,video,qtmultimedia,qt5.7,C++,Qt,Video,Qtmultimedia,Qt5.7,我想做的是在某个时间获取视频帧(例如20秒)。 我知道我可以这样做-倒带视频并暂停: QMediaPlayer* player = new QMediaPlayer; ... player->play(); player->setPosition(20000); player->pause(); 但是否有更优雅的解决方案(这对我来说似乎是一种攻击,因为我不需要整个视频,但有时只需要一帧)?以下步骤可以帮助您从视频文件中捕获一帧。 项目级 QT+=多媒体 代码级别 启动QMed

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

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

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

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

项目级

  • QT+=多媒体
  • 代码级别

  • 启动QMediaplayer对象(QMediaplayer(QObject父对象,QMediaplayer::VideoSurface)
  • 将QMediaplayer.setVideoOutput设置为(QAbstractVideoSurface的子类)
  • QAbstractVideoSurface的子类应重新实现支持的方法PixelFormats、isFormatSupported、start、present
    4.通过当前的方法,我们可以得到每一帧的图像缓冲区
  • 使用QMediaplayer加载视频文件
  • 设置静音=真(音频)
  • 将所需的位置(以毫秒为单位)设置为QMediaplayer对象
  • 开始播放方法
  • present方法将接收到的数据缓冲区转换为QImage,然后再转换为QPixmap(如果需要)
  • 获得pixmap后,使用它加载小部件(例如:在QLabel中)
  • 立即暂停播放视频文件(如果需要捕获其他帧,请使用other wise stop()而不是pause())。这可以使用从子类对象(QAbstractVideoSurface)到QMediaPlayer对象的信号槽来完成
  • 完成后,调用QAbstractVideoSurface子类的stop方法,然后调用QMediaplayer
  • 上述示例应用程序可以找到

    (应用程序屏幕截图)

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

    保存:保存捕获的图像

    这可能会帮助您。另一个可能会帮助您。如何正确播放视频在这种情况下,我捕获了帧,但没有播放视频文件。您能帮助吗?