gpt4 book ai didi

python - 使用 PySide 在 QLabel 中显示视频流

转载 作者:太空狗 更新时间:2023-10-30 02:05:27 26 4
gpt4 key购买 nike

任何人都可以指出如何在 PySide 中创建新的 QMovie“提供者”的正确方向吗?

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

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

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

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

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

最佳答案

以下是我如何成功实现此功能的引用,以供将来引用。

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

关于python - 使用 PySide 在 QLabel 中显示视频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11401115/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com