Как воспроизвести простую песню, используя Phonon PyQt? - PullRequest
3 голосов
/ 08 ноября 2011

Я пытаюсь воспроизвести один файл mp3 на моем программном обеспечении при нажатии кнопки.Вот как я это сделал:

QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), playsong)

и функция:

def playsong():            
        m_media = Phonon.MediaObject()
        m_media.setCurrentSource(Phonon.MediaSource("files/song.mp3"))
        m_media.play()

Это не вызывает никаких ошибок.Но песня не будет играть.Я видел много примеров на C ++ и на Python, в котором много песен, плейлистов и т. Д. Я просто хочу сыграть одну песню, я что-то упустил?

Ответы [ 2 ]

5 голосов
/ 08 ноября 2011

Я использую phonon в pyqt, и мой код содержит еще несколько строк:

output = Phonon.AudioOutput(Phonon.MusicCategory)
m_media = Phonon.MediaObject()
Phonon.createPath(m_media, output)
m_media.setCurrentSource(Phonon.MediaSource("files/song.mp3"))
m_media.play()

Но, честно говоря, я обнаружил, что phonon не может воспроизводить некоторые специфические песни со странными тегами ID3, поэтому я переключился на pyaudiere (https://pypi.python.org/pypi/pyaudiere),, который намного более стабилен (но да, его менее интегрирован с Qt).

4 голосов
/ 08 ноября 2011

Вот простой пример музыкального проигрывателя:

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

class Window(QtGui.QPushButton):
    def __init__(self):
        QtGui.QPushButton.__init__(self, 'Choose File')
        self.mediaObject = Phonon.MediaObject(self)
        self.audioOutput = Phonon.AudioOutput(Phonon.MusicCategory, self)
        Phonon.createPath(self.mediaObject, self.audioOutput)
        self.mediaObject.stateChanged.connect(self.handleStateChanged)
        self.clicked.connect(self.handleButton)

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

    def handleStateChanged(self, newstate, oldstate):
        if newstate == Phonon.PlayingState:
            self.setText('Stop')
        elif newstate == Phonon.StoppedState:
            self.setText('Choose File')
        elif newstate == Phonon.ErrorState:
            source = self.mediaObject.currentSource().fileName()
            print 'ERROR: could not play:', source.toLocal8Bit().data()

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('Phonon')
    win = Window()
    win.resize(200, 100)
    win.show()
    sys.exit(app.exec_())
...