在提供的时间Qt中获取视频帧
Getting video frame in provided time Qt
我想做的是在某个时间(例如20秒)获取视频帧。
我知道我可以做这样的事情 - 倒回视频并暂停它:
QMediaPlayer* player = new QMediaPlayer;
...
player->play();
player->setPosition(20000);
player->pause();
但是有没有更优雅的解决方案(这对我来说似乎是一个黑客,因为我不需要整个视频,但有时只需要一帧)?
以下步骤可能会帮助您从视频文件中捕获帧。
项目级别
- QT += 多媒体
代码级别
- 初始化QMediaplayer对象(QMediaPlayer(QObject parent, QMediaPlayer::VideoSurface)
- 将QMediaplayer.setVideoOutput设置为(QAbstractVideoSurface的Subclass)
QAbstractVideoSurface 的 - Subclass 应该重新实现方法 supportedPixelFormats、isFormatSupported、start、present
4.Frompresent方法我们可以得到每一帧的图像缓冲区
- 使用 QMediaplayer 加载视频文件
- setMute = true(音频)
- 设置 QMediaplayer 对象所需的位置(以毫秒为单位)
- 开始播放方法
- 从present方法将接收到的数据缓冲区转换为QImage,然后再转换为QPixmap(如果需要)。
- 获得像素图后,使用它加载小部件(例如:在 QLabel 中)
- 立即暂停视频文件播放(如果您需要捕获其他帧。其他明智的做法是停止()而不是暂停())。这可以使用从 subclass 的对象 (QAbstractVideoSurface) 到 QMediaPlayer 对象
的信号槽来完成
- 完成后,调用QAbstractVideoSurface的sub class的stop方法,然后调用QMediaplayer
可以找到上述示例应用程序 here
(应用程序屏幕截图)
打开视频文件:浏览并select一个视频文件
滑块:select你想要的位置
捕获:捕获图像并在 QLabel
中查看
保存 : 保存拍摄的图像
我想做的是在某个时间(例如20秒)获取视频帧。 我知道我可以做这样的事情 - 倒回视频并暂停它:
QMediaPlayer* player = new QMediaPlayer;
...
player->play();
player->setPosition(20000);
player->pause();
但是有没有更优雅的解决方案(这对我来说似乎是一个黑客,因为我不需要整个视频,但有时只需要一帧)?
以下步骤可能会帮助您从视频文件中捕获帧。
项目级别
- QT += 多媒体
代码级别
- 初始化QMediaplayer对象(QMediaPlayer(QObject parent, QMediaPlayer::VideoSurface)
- 将QMediaplayer.setVideoOutput设置为(QAbstractVideoSurface的Subclass) QAbstractVideoSurface 的
- Subclass 应该重新实现方法 supportedPixelFormats、isFormatSupported、start、present
4.Frompresent方法我们可以得到每一帧的图像缓冲区 - 使用 QMediaplayer 加载视频文件
- setMute = true(音频)
- 设置 QMediaplayer 对象所需的位置(以毫秒为单位)
- 开始播放方法
- 从present方法将接收到的数据缓冲区转换为QImage,然后再转换为QPixmap(如果需要)。
- 获得像素图后,使用它加载小部件(例如:在 QLabel 中)
- 立即暂停视频文件播放(如果您需要捕获其他帧。其他明智的做法是停止()而不是暂停())。这可以使用从 subclass 的对象 (QAbstractVideoSurface) 到 QMediaPlayer 对象 的信号槽来完成
- 完成后,调用QAbstractVideoSurface的sub class的stop方法,然后调用QMediaplayer
可以找到上述示例应用程序 here
(应用程序屏幕截图)
打开视频文件:浏览并select一个视频文件
滑块:select你想要的位置
捕获:捕获图像并在 QLabel
中查看
保存 : 保存拍摄的图像