使用Python、PyQt和Phonon播放mp3

7 投票
3 回答
11477 浏览
提问于 2025-04-15 12:41

我今天一直在尝试用Python搞懂Qt的Phonon库。

我的长期目标是看看能否让它播放一个mms://的流媒体,但因为网上找不到相关的实现,我决定自己来解决这个问题。(我想如果有人对这个具体问题了解更多,那就太好了,如果没有也没关系。)

总之,我打算从网上找到的一个可以运行的例子开始倒推。这个例子会打开一个文件浏览器,并播放指定的mp3文件。我想把文件浏览器的部分去掉,简化到只执行脚本并播放一个路径写死的Mp3文件。

我觉得我的问题可能是对setCurrentSource()的理解有误,还有就是数据类型的指定。(参考:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/phonon-mediasource.html#fileName

我把问题提得比较宽泛,因为任何关于Phonon的理解帮助都会非常感激。

import sys

from PyQt4.QtGui import QApplication, QMainWindow, QDirModel, QColumnView
from PyQt4.QtGui import QFrame
from PyQt4.QtCore import SIGNAL
from PyQt4.phonon import Phonon

class MainWindow(QMainWindow):

    m_model = QDirModel()

    def __init__(self):
        QMainWindow.__init__(self)
        self.m_fileView = QColumnView(self)
        self.m_media = None

        self.setCentralWidget(self.m_fileView)
        self.m_fileView.setModel(self.m_model)
        self.m_fileView.setFrameStyle(QFrame.NoFrame)

        self.connect(self.m_fileView,
            SIGNAL("updatePreviewWidget(const QModelIndex &)"), self.play)

    def play(self, index):
        self.delayedInit()
        self.m_media.setCurrentSource(
            Phonon.MediaSource(self.m_model.filePath(index)))
        self.m_media.play()

    def delayedInit(self):
        if not self.m_media:
            self.m_media = Phonon.MediaObject(self)
            audioOutput = Phonon.AudioOutput(Phonon.MusicCategory, self)
            Phonon.createPath(self.m_media, audioOutput)

def main():
    app = QApplication(sys.argv)
    QApplication.setApplicationName("Phonon Tutorial 2 (Python)")
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

3 个回答

1

如果Phonon没有输出音频或视频,但也没有报错,你可能只需要运行一下 sudo apt-get install phonon-backend-gstreamer,还有可能需要再运行 sudo apt-get install libphonon-dev

Phonon在后台使用gstreamer或vlc,但这个过程是悄悄进行的,所以如果没有这些支持,就不会报错,但也无法正常工作。运行完这些命令后,我在我的树莓派上就能听到Phonon的声音了。

希望这能在将来帮助到某些人。

1

delayedInit方法中,像下面这样创建一个MediaObject

def delayedInit(self):
    if not self.m_media:
       self.m_media = Phonon.createPlayer(Phonon.MusicCategory)
3

Phonon这个工具在不同的平台上支持不同的音频文件格式,它会使用系统本身对媒体格式的支持。所以,有可能你的系统没有提供播放MP3文件的库。确实,有些Linux系统默认是不支持MP3格式的。如果你在使用Linux,可以看看下面这个页面,了解如何启用MP3支持:

http://doc.qt.io/qt-4.8/phonon-overview.html#linux

另外,检查Phonon支持哪些媒体格式的一个方法是运行Qt提供的Capabilities示例:

http://doc.qt.io/qt-4.8///qt-phonon-capabilities-example.html

这个示例可以告诉你你的系统支持哪些媒体格式。

撰写回答