在QLabel显示视频流与PySide(Displaying a video stream in Q

2019-06-26 04:29发布

任何人都可以点我如何在PySide创建一个新的QMovie“提供者”向正确的方向?

我有希望尽可能简单地显示为可能的(没有音频,仅仅一个具有未知和可变帧率帧的序列)的视频流。 这个例子似乎只是我的视频是从非常规的来源来完善。 这不是一个文件,但不规范的格式的网络流。 我可以很容易地写出用于接收每一帧的代码和我的想法是创建一个“QMovie提供者”,这样我可以只显示一个标签有关此流如上面的例子。

我首先想到的是只要继承QMovie和覆盖的一些功能有,但我开始阅读时有关于第二个想法的文件 ,因为我不知道我应该做的“设备”我的实例可以被读取。

我注意到,QMovie使用QImageReader所以我的下一个念头,就是继承了该类上述文件中,并将它从我流中读取帧。 这提出了类似的问题。然而,例如,我应该做的“supportedImageFormats()”函数?

我已经与我的QLabel只是直接更新图像尝试每一次我收到一个新的框架,但那时我已经得到了错误“的QPixmap:这是不是安全使用GUI线程之外的像素图”。

所以基本上我有点为难,真的希望如何让一个QLabel在一个PySide应用程序中显示我的视频流的任何指针或教程。

Answer 1:

以供将来参考这里就是我设法得到这个工作。

使用信号和插槽机制,下面的应用程序工作。 信号/槽机制似乎弄清楚,其获取up_camera_callback函数内部产生并发射到CameraDisplay.updateFrame功能的图像是从不同的线程来,并采取必要的预防措施。

class CameraDisplay(QtGui.QLabel):
  def __init__(self):
    super(CameraDisplay, self).__init__()

  def updateFrame(self, image):
    self.setPixmap(QtGui.QPixmap.fromImage(image))

class ControlCenter(QtGui.QWidget):
  up_camera_signal = QtCore.Signal(QtGui.QImage)
  up_camera = None

  def __init__(self):
    super(ControlCenter, self).__init__()
    self.up_camera = CameraDisplay()
    self.up_camera_signal.connect(self.up_camera.updateFrame)

    grid = QtGui.QGridLayout()
    grid.setSpacing(10)

    grid.addWidget(self.up_camera, 0, 0)

    self.setLayout(grid)

    self.setGeometry(300, 300, 350, 300)
    self.setWindowTitle('Control Center')
    self.show()

  def up_camera_callback(self, data):
    '''This function gets called by an external thread'''
    try:
      image = QtGui.QImage(data.data, data.width, data.height, QtGui.QImage.Format_RGB888)
      self.up_camera_signal.emit(image)

    except Exception, e:
      print(e)

if __name__ == "__main__":
  app = QtGui.QApplication(sys.argv)
  ex = ControlCenter()
  sys.exit(app.exec_())


文章来源: Displaying a video stream in QLabel with PySide