2

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

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

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

4

1 回答 1

6

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

项目级别

  1. QT +=多媒体

代码级别

  1. 启动 QMediaplayer 对象(QMediaPlayer(QObject parent, 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 中查看
保存:保存捕获的图像

于 2016-07-20T14:45:39.530 回答