2017-03-15 26 views
0

以下は、PyQt5のサンプルビデオを再生するために使用していたテストスクリプトです。残念ながら、ビデオをロードした直後に、mediaPlayer mediaStatusがコード8(InvalidMedia)に切り替わります。ローカルバージョンの.mp4でこれを試してみましたが、無駄です。私は他のファイルを試しましたが、それ以上問題を診断することはできません。スタックオーバーフローのどこか他の場所でこの実装が見つかったので、誰かが完全に異なる実装方法を知っていれば、私はそれを公開しています。WIndowsでPyQt5でQMediaPlayerを使用するとエラーが発生する

さらに、私の.mp4で "チュートリアル"ビデオプレーヤーをテストしましたが、それでも何も再生されませんでした。 Github

from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWidgets import * 
from PyQt5.QtMultimedia import * 
from PyQt5.QtMultimediaWidgets import * 
import glob 


class MainWindow(QMainWindow): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.setWindowTitle('Navon test') 
     self.setWindowFlags(Qt.FramelessWindowHint) 
     # exit option for the menu bar File menu 
     self.exit = QAction('Exit', self) 
     self.exit.setShortcut('Ctrl+q') 
     # message for the status bar if mouse is over Exit 
     self.exit.setStatusTip('Exit program') 
     # newer connect style (PySide/PyQT 4.5 and higher) 
     self.exit.triggered.connect(app.quit) 
     self.setWindowIcon(QIcon('icon.ico')) 
     self.centralwidget = VideoPlayer() 
     self.setCentralWidget(self.centralwidget) 

    def keyPressEvent(self, e): 
     player = self.centralwidget.mediaPlayer 
     print('state: ' + str(player.state())) 
     print('mediaStatus: ' + str(player.mediaStatus())) 
     print('error: ' + str(player.error())) 
     if e.key() == Qt.Key_L: 
      print('loading') 
      self.centralwidget.load() 
     # update : missed() here 
     if e.key() == Qt.Key_P: 
      print('playing') 
      self.centralwidget.play() 


class VideoPlayer(QWidget): 
    def __init__(self, parent=None): 
     super(VideoPlayer, self).__init__(parent) 
     self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface) 
     self.videoItem = QGraphicsVideoItem() 
     self.videoItem.setSize(QSizeF(640, 480)) 
     scene = QGraphicsScene(self) 
     graphicsView = QGraphicsView(scene) 
     scene.addItem(self.videoItem) 
     layout = QVBoxLayout() 
     layout.addWidget(graphicsView) 
     self.setLayout(layout) 
     self.mediaPlayer.setVideoOutput(self.videoItem) 

    def load(self): 
     local = QUrl('http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4') 
     self.mediaPlayer.setMedia(QMediaContent(local)) 

    def play(self): 
     self.mediaPlayer.play() 


if __name__ == '__main__': 
    import sys 

    app = QApplication(sys.argv) 
    player = MainWindow() 
    player.show() 
    sys.exit(app.exec_()) 
+0

システムに必要なビデオコーデックがすべてインストールされていますか?例を '.wmv'ファイルで実行して、正しく動作することを確認してください。 – ekhumoro

+0

これは本当に問題でした。チュートリアルがロードされなくても、適切なコーデックがどこにあるかはわかりませんでした。有益な答えをありがとう! – ThePyrotechnic

答えて

0

まず、自分のコードを添付してください。

from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWidgets import * 
from PyQt5.QtMultimedia import * 
from PyQt5.QtMultimediaWidgets import * 

class VideoPlayer(QWidget): 
    def __init__(self, parent=None): 
     super(VideoPlayer, self).__init__(parent) 
     videoItem = QGraphicsVideoItem() 
     videoItem.setSize(QSizeF(640, 480)) 
     scene = QGraphicsScene(self) 
     scene.addItem(videoItem) 
     graphicsView = QGraphicsView(scene) 
     layout = QVBoxLayout() 
     layout.addWidget(graphicsView) 
     self.setLayout(layout) 
     self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface) 
     self.mediaPlayer.setVideoOutput(videoItem) 

    def keyPressEvent(self, e): 
     print('state: ' + str(self.mediaPlayer.state())) 
     print('mediaStatus: ' + str(self.mediaPlayer.mediaStatus())) 
     print('error: ' + str(self.mediaPlayer.error())) 
     if e.key() == Qt.Key_L: 
      print('loading') 
      self.load() 
     if e.key() == Qt.Key_P: 
      print('playing') 
      self.mediaPlayer.play() 

    def load(self): 
     local = QUrl.fromLocalFile('C:\\Users\\tank.sui\\Videos\\Wildlife.wmv') 
     media = QMediaContent(local) 
     self.mediaPlayer.setMedia(media) 

if __name__ == '__main__': 
    import sys 
    app = QApplication(sys.argv) 
    player = VideoPlayer() 
    player.show() 
    sys.exit(app.exec_()) 

コードを確認した後、以下の根本原因を列挙してください。 QUrl.fromLocalFile

local = QUrl.fromLocalFile('C:\\Users\\tank.sui\\Videos\\Wildlife.wmv') 

いくつかのオーディオ/ビデオフォーマットをサポートするために2017年/ 3月15日

@更新は、対応するデコーダをインストールする必要があります。

LAVFiltersお勧めします。RELEASEからダウンロードしてインストールできます。

関連する問題