5

PySideで新しいQMovie「プロバイダー」を作成する方法について誰かが私を正しい方向に向けることができますか?

できるだけ簡単に表示したいビデオストリームがあります(オーディオなし、フレームレートが不明で可変のフレームのシーケンスのみ)。この例は、私のビデオが型破りなソースからのものであることを除けば、完璧に見えます。これはファイルではなく、標準化されていない形式のネットワークストリームです。各フレームを受け取るコードを簡単に書くことができます。私の考えは、上記の例のようにこのストリームをラベルに表示できるように、「QMovieプロバイダー」を作成することです。

私の最初の考えは、QMovieをサブクラス化し、そこでいくつかの関数を上書きすることでしたが、インスタンスが読み取る「デバイス」について何をすべきかわからないため、ドキュメントを読むときにそれについて考え直し始めました。

前述のドキュメントで、QMovieがQImageReaderを使用していることに気付いたので、次の考えは、そのクラスを拡張して、ストリームからフレームを読み取らせることでした。それは同様の質問を提起しますが、たとえば、「supportedImageFormats()」関数で何をすべきですか?

新しいフレームを受信するたびにQLabelの画像を直接更新することを試みてきましたが、「QPixmap:GUIスレッドの外部でpixmapを使用するのは安全ではありません」というエラーが発生します。

したがって、基本的に私は少し困惑しており、PySideアプリケーションでビデオストリームを表示するためにQLabelを取得する方法についてのポインタやチュートリアルを本当にいただければ幸いです。

4

1 に答える 1

9

今後の参考のために、これをどのように機能させることができたかを説明します。

信号とスロットメカニズムを使用して、次のアプリケーションが動作します。シグナル/スロットメカニズムは、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_())
于 2012-07-10T01:59:18.323 に答える