Воспроизведение файлов MOV в PyQt - PullRequest
3 голосов
/ 14 декабря 2011

Я хотел бы открыть файл mov в своем приложении PyQt с помощью Quicktime-плеера.

Я пытаюсь использовать модуль phonon, но почему-то не могу заставить его работать.

В моем файле пользовательского интерфейса (сгенерированном дизайнером Qt) он инициализируется так:

self.videoPlayer = phonon.Phonon.VideoPlayer(self.gridLayoutWidget)
self.videoPlayer.setObjectName(_fromUtf8("videoPlayer"))

И в моем коде я пытаюсь это:

media_source = phonon.Phonon.MediaSource("path\\to\\my\\media.mov")
self.ui.videoPlayer.load(media_source)
self.ui.videoPlayer.play()

Может кто-то указать мнегде я делаю что-то не так?

1 Ответ

4 голосов
/ 14 декабря 2011

Я не вижу ничего явно неправильного в коде, который вы разместили. Если в вашей системе есть необходимые кодеки, нет причины, по которой phonon не сможет воспроизводить файлы быстрого времени.

Ниже приведена простая демонстрация фононов, которая воспроизводит мне файлы быстрого времени (в Linux, с помощью бэкэнда GStreamer). Демонстрация также перечисляет все доступные типы mime, которые может обрабатывать текущий фононный бэкэнд. На моей системе в списке отображается mime-тип "video / quicktime".

Если вы запустите его в консоли, он также распечатает любые сообщения об ошибках фононов.

EDIT

Похоже, что в Windows фонон может использовать Windows Media Player в качестве бэкэнда. Если это так, то может потребоваться установить некоторые дополнительные кодеки для WMP, чтобы он мог воспроизводить файлы быстрого времени.

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

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.media = Phonon.MediaObject(self)
        self.media.stateChanged.connect(self.handleStateChanged)
        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.button = QtGui.QPushButton('Choose File', self)
        self.button.clicked.connect(self.handleButton)
        self.list = QtGui.QListWidget(self)
        self.list.addItems(Phonon.BackendCapabilities.availableMimeTypes())
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.video, 1)
        layout.addWidget(self.button)
        layout.addWidget(self.list)

    def handleButton(self):
        if self.media.state() == Phonon.PlayingState:
            self.media.stop()
        else:
            path = QtGui.QFileDialog.getOpenFileName(self, self.button.text())
            if path:
                self.media.setCurrentSource(Phonon.MediaSource(path))
                self.media.play()

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

if __name__ == '__main__':

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