【问题标题】:Displaying a video stream in QLabel with PySide使用 PySide 在 QLabel 中显示视频流
【发布时间】:2012-07-09 05:01:34
【问题描述】:

谁能指出我如何在 PySide 中创建一个新的 QMovie“提供者”的正确方向?

我有一个视频流,我想尽可能简单地显示(没有音频,只有一系列帧速率未知且可变的帧)。 This example 看起来很完美,只是我的视频来自非常规来源。它不是文件,而是格式不规范的网络流。我可以轻松编写接收每一帧的代码,我的想法是创建一个“QMovie 提供程序”,这样我就可以在上面示例中的标签上显示此流。

我的第一个想法是继承 QMovie 并覆盖其中的一些函数,但在阅读 the documentation 时我开始重新考虑这一点,因为我不知道我应该如何处理我的实例将要阅读的“设备”来自。

我在上述文档中注意到 QMovie 使用 QImageReader,所以我的下一个想法是扩展该类并让它从我的流中读取帧。然而,这提出了类似的问题,例如,我应该如何处理“supportedImageFormats()”函数?

我一直在尝试每次收到新帧时直接更新我的 QLabel 上的图像,但随后我收到错误“QPixmap:在 GUI 线程之外使用像素图不安全”。

所以基本上我有点难过,非常感谢任何关于如何让 QLabel 在 PySide 应用程序中显示我的视频流的指针或教程。

【问题讨论】:

    标签: python pyqt pyside qpixmap qlabel


    【解决方案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_())
    

    【讨论】:

      猜你喜欢
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      相关资源
      最近更新 更多