2012-07-09 73 views
4

任何人都可以指出我如何在PySide中创建一个新的QMovie“提供者”的正确方向?用PySide在QLabel中显示视频流

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

我的第一个想法是只是继承QMovie并覆盖了一些函数,但是当我读the documentation时,我开始有第二个想法,因为我不知道我应该怎样处理我的实例将从中读取的“设备” 。

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

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

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

回答

8

为了将来的参考,我设法让这个工作。

使用信号和插槽机制,以下应用程序工作。信号/插槽机制似乎发现在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_()) 
+0

+1为跟随未来世代... – neuronet 2014-06-09 02:43:59