2012-08-30 24 views

回答

2

回答此問題的最佳方法是嘗試播放您感興趣的文件類型,或查看受支持的mimetypes列表。

這裏有一個演示視頻播放器,應該讓你做到這一點:

from PySide import QtGui, QtCore 
from PySide.phonon import Phonon 

class Window(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.setWindowTitle('Video Player') 
     self.media = Phonon.MediaObject(self) 
     self.video = Phonon.VideoWidget(self) 
     self.video.setMinimumSize(400, 400) 
     self.audio = Phonon.AudioOutput(Phonon.VideoCategory, self) 
     Phonon.createPath(self.media, self.audio) 
     Phonon.createPath(self.media, self.video) 
     self.buttonChoose = QtGui.QPushButton('Choose File', self) 
     self.buttonMimes = QtGui.QPushButton('Show Mimetypes', self) 
     self.slider = Phonon.VolumeSlider(self) 
     self.slider.setAudioOutput(self.audio) 
     layout = QtGui.QGridLayout(self) 
     layout.addWidget(self.video, 0, 0, 1, 2) 
     layout.addWidget(self.buttonChoose, 1, 0) 
     layout.addWidget(self.buttonMimes, 1, 1) 
     layout.addWidget(self.slider, 2, 0, 1, 2) 
     layout.setRowStretch(0, 1) 
     self.media.stateChanged.connect(self.handleStateChanged) 
     self.buttonChoose.clicked.connect(self.handleButtonChoose) 
     self.buttonMimes.clicked.connect(self.handleButtonMimes) 

    def handleButtonChoose(self): 
     if self.media.state() == Phonon.PlayingState: 
      self.media.stop() 
     else: 
      dialog = QtGui.QFileDialog(self) 
      dialog.setFileMode(QtGui.QFileDialog.ExistingFile) 
      if dialog.exec_() == QtGui.QDialog.Accepted: 
       path = dialog.selectedFiles()[0] 
       self.media.setCurrentSource(Phonon.MediaSource(path)) 
       self.media.play() 
      dialog.deleteLater() 

    def handleButtonMimes(self): 
     dialog = MimeDialog(self) 
     dialog.exec_() 

    def handleStateChanged(self, newstate, oldstate): 
     if newstate == Phonon.PlayingState: 
      self.buttonChoose.setText('Stop') 
     elif (newstate != Phonon.LoadingState and 
       newstate != Phonon.BufferingState): 
      self.buttonChoose.setText('Choose File') 
      if newstate == Phonon.ErrorState: 
       source = self.media.currentSource().fileName() 
       print ('ERROR: could not play: %s' % source) 
       print (' %s' % self.media.errorString()) 

class MimeDialog(QtGui.QDialog): 
    def __init__(self, parent): 
     QtGui.QDialog.__init__(self, parent) 
     self.setAttribute(QtCore.Qt.WA_DeleteOnClose) 
     self.setWindowTitle('Mimetypes') 
     listbox = QtGui.QListWidget(self) 
     listbox.setSortingEnabled(True) 
     backend = Phonon.BackendCapabilities 
     listbox.addItems(backend.availableMimeTypes()) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(listbox) 
     self.resize(300, 500) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    app.setApplicationName('Phonon Player') 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 
+0

當我運行你的程序時,它肯定會生成一個窗口應用程序,但我猜它不能用來播放視頻。 – iMath

+0

@ user1485853。再次測試一下,對於我使用PySide或PyQt4以及Linux和WinXP上的avi文件都可以正常工作。你嘗試播放哪些文件,以及看到哪些錯誤信息?另外,你在哪個平臺上? – ekhumoro

1

聲子是一個包裝庫由KDE設計和採用的Qt upsteam。該庫的目的是增加多媒體應用程序的可移植性,以抽象出執行媒體播放的實際子系統的細節。在Windows上,DirectShow播放實際的文件;在OS X上,QuickTime。在Linux上,任何數量的媒體後端都可以播放該文件,並且每個都有自己的功能。使用VLC後端,你可以在所有平臺上玩太陽下的所有東西!

結果是,作爲應用程序開發人員,您不知道Phonon能夠在運行代碼的計算機上播放什麼格式。然而,Phonon提供了一些機制來找出後端正在被使用以及它的功能是什麼。一個很好的例子是this tutorial - 雖然用C++編寫。應該很容易理解並移植到python。

+0

如何使用VLC後端作爲Phonon的後端? – iMath