PyQt视频帧更新信号(每个视频帧后都有触发功能)

时间:2018-12-12 17:56:44

标签: python pyqt pyqt5 qgraphicsscene qmediaplayer

我正在创建视频播放器,我需要在其上面绘制一些多边形。我正在使用QGraphicsScene创建此图像,并且需要在每一帧后更新屏幕上的多边形。我目前正在将QMediaPlayer与QGraphicsVideoItem配对使用来创建它。我遇到的问题是QMediaPlayer没有在每个帧上激活的信号。它具有positionChanged(),但这似乎仅每秒触发一次。

我尝试使用QMovie,因为它确实在每个帧上发送更新,但是没有显示任何内容。这是我用来实现此目标的代码。

    video_view = QGraphicsView()#view to hold video
    video_item = QGraphicsVideoItem()#video item for scene
    video_scene = QGraphicsScene()#scene for Qgraphics view
    video_view.setScene(video_scene)

    label = QLabel()
    movie = QMovie(self.video_paths[index]) #contains file path
    label.setMovie(movie)
    video_scene.addWidget(label)
    self.vlayout_main_video.addWidget(video_view)

我正在使用的视频文件是.avi文件,它的大小为72Mb。

如果有人能指出正确的方向,我将非常感激。我目前正在使用PyQt5。

谢谢

1 个答案:

答案 0 :(得分:2)

有2个选项:

  • positionChanged每秒钟发出一次,因为notifyInterval的{​​{1}}属性是在该时段设置的。因此,您可以将该属性更改为例如60毫秒。

QMediaPlayer
  • 使用来自from PyQt5 import QtCore, QtGui, QtWidgets, QtMultimedia, QtMultimediaWidgets class MainWindow(QtWidgets.QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) scene = QtWidgets.QGraphicsScene(self) self.video_view = QtWidgets.QGraphicsView(scene) self.setCentralWidget(self.video_view) self.player = QtMultimedia.QMediaPlayer(self, QtMultimedia.QMediaPlayer.VideoSurface) self.video_item = QtMultimediaWidgets.QGraphicsVideoItem() self.player.setVideoOutput(self.video_item) scene.addItem(self.video_item) file = "/path/of/video" self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(file))) self.player.positionChanged.connect(self.on_positionChanged) self.player.setNotifyInterval(60) self.player.play() @QtCore.pyqtSlot('qint64') def on_positionChanged(self, p): print(p, QtCore.QTime.currentTime().toString("hh:mm:ss.zzz")) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) w = MainWindow() w.resize(640, 480) w.show() sys.exit(app.exec_()) 的{​​{1}}信号:

VideoFrameProbed