2016-12-14 10 views
1

このような多くの疑問がありましたが、多くの問題が解決されていないか、私の状況と無関係なようです。PyQt5 - ストリームからビデオを再生することができません

mongodbコレクションでシリアライズされたデータとして(ピクルを介して)保存されたビデオを再生しようとしています。

ここでは、コードです:

binary_file = my_database_entry['binary video'] 
    unpickle = pickle.dumps(binary_file) 

    outByteArray = QByteArray(unpickle) 
    mediaStream = QBuffer() 
    mediaStream.setBuffer(outByteArray) 
    mediaStream.open(QIODevice.ReadWrite) 

    mediaPlayer.setMedia(QMediaContent(), mediaStream) 
    mediaPlayer.play() 

「my_database_entry」はMongoDBのエントリであると「バイナリビデオは」漬けビデオ入力用辞書のキーです。 はこれもメディアプレーヤが適切に作成され、私のユーザーインターフェース、すなわち私も「QMediaPlayer.StreamPlayback」フラグとのMediaPlayerを初期化しようとした

mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface) 
    videoPlayer = QVideoWidget() 
    mediaPlayer.setVideoOutput(videoPlayer) 

が、再び、何も内で初期化されていることを前提としています。

Windowsで試してみるとクラッシュし、Macで試してみると黒い画面になります。エラーログも何もありません(どんなことでも啓発はありません)。

誰もがこれを成功させるためにこれを手に入れた人がいますか?あればどうしましたか?

ありがとうございます! -Mark

答えて

3

バッファとその基礎となるデータの両方を参照する必要があります。それ以外の場合は、プレーヤーの起動後にガベージコレクションされます。

あなたの例では、それは単なるバイトなので、ビデオデータを完全に無意味なので、シリアル化する価値はありません。 Pickleは、listdictなどの構造化されたPythonオブジェクトにのみ便利です。

以下は、完全なビデオプレーヤーを搭載したデモスクリプトです。上記の溶液にのみ機能します

:UPDATE

from PyQt5 import QtCore, QtWidgets 
from PyQt5 import QtMultimedia, QtMultimediaWidgets 

class Window(QtWidgets.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.player = QtMultimedia.QMediaPlayer(self) 
     self.viewer = QtMultimediaWidgets.QVideoWidget(self) 
     self.player.setVideoOutput(self.viewer) 
     self.player.stateChanged.connect(self.handleStateChanged) 
     self.button1 = QtWidgets.QPushButton('Play', self) 
     self.button2 = QtWidgets.QPushButton('Stop', self) 
     self.button1.clicked.connect(self.handleButton) 
     self.button2.clicked.connect(self.player.stop) 
     self.button2.setEnabled(False) 
     layout = QtWidgets.QGridLayout(self) 
     layout.addWidget(self.viewer, 0, 0, 1, 2) 
     layout.addWidget(self.button1, 1, 0) 
     layout.addWidget(self.button2, 1, 1) 
     self._buffer = QtCore.QBuffer(self) 
     self._data = None 

    def handleButton(self): 
     path = QtWidgets.QFileDialog.getOpenFileName(self)[0] 
     if path: 
      self.button1.setEnabled(False) 
      self.button2.setEnabled(True) 
      with open(path, 'rb') as stream: 
       self._data = stream.read() 
       self._buffer.setData(self._data) 
       self._buffer.open(QtCore.QIODevice.ReadOnly) 
       self.player.setMedia(
        QtMultimedia.QMediaContent(), self._buffer) 
       self.player.play() 

    def handleStateChanged(self, state): 
     if state == QtMultimedia.QMediaPlayer.StoppedState: 
      self._buffer.close() 
      self._data = None 
      self.button1.setEnabled(True) 
      self.button2.setEnabled(False) 

if __name__ == '__main__': 

    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(500, 50, 640, 480) 
    window.show() 
    sys.exit(app.exec_()) 

:それはinitallyファイル・システムからのビデオリソースを取得しますが、それはデータベースから来た場合、それだけで同じ動作します

  • 参照:Qt Multimedia Backends
  • WindowsおよびLinux上で、OSX上でのストリーミングのサポートは、現在存在しないため、 210
+0

それはまさにそれでした。完璧に動作します。私の場合、簡潔にするために十分に説明していませんでした。私はまだそれが働くためにデータをunpickleする必要がありました。解凍は基本的に 'open(path、' rb ')as stream:'などのコードの代わりに使用されました。再度、感謝します!! – huitlacoche

+0

この方法では少し問題が発生しました。 Windowsマシンでうまく動作しますが、OSXに行くと黒い画面が表示されます。顕著なエラーはありません。おそらくこれはMac固有のバグですか? – huitlacoche

+0

@huitlacoche。私はLinuxを試してみましたが、OSXで自分自身でテストすることはできません。それは問題を引き起こしているメディアそのものかもしれないので、いくつかの異なるビデオ形式を試してみることをお勧めします。ファイルURLを使用して同じメディアを直接ロードしようとしましたか?私は真剣なプロジェクトで実際に使ったことがないので、Qt Multimediaがどれほど信頼性が高いのか分かりません。 (PS:Linux上でもう少しファイルを試してみましたが、1〜2つはうまくロードできませんでした。 – ekhumoro

関連する問題