用Pyqt4和QSound播放声音

时间:2013-04-01 20:02:45

标签: python qt audio pyqt4

为了保持简短,经过几个小时寻找在pyqt4中播放声音的方法,我仍然无法弄清楚为什么这个简单的小代码不起作用?我没有收到任何错误信息,但没有声音(我试过mp3,ogg和wav)我只是得到一个小窗口“bing”声音,但不是我想要的声音文件。我知道有声子,但我真的想用各种原因来使用QSound,也因为它应该更加简单。如果你能给我任何暗示,为什么这不起作用或者给出一个使用QSound工作代码的例子,我将非常感激。

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import QSound

class Example(QtGui.QMainWindow):

    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.initUI()

    def initUI(self):

        self.setGeometry(300,300,200,200)

        self.b1 = QtGui.QPushButton("Play", self)
        self.b1.clicked.connect(self.Play)
        self.b1.move(50, 80)


    def Play(self):

        QSound.play("C:\directory\b1.mp3")




def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

1 个答案:

答案 0 :(得分:3)

这里可能有两个不同的问题。


首先,如果要使用Windows样式的路径名,则需要使用原始字符串或反斜杠转义符。在常规字符串中,\b是单个退格字符,而不是\后跟b。换句话说,当您确实要播放文件C:\\directory\\b1.mp3时,您正尝试播放文件' C:\ directory \ x081.mp3'有关详细信息,请参阅文档中的String and Bytes literals

您可以尝试记住所有特殊的反斜杠转义字符,但更简单的解决方案是始终转义所有反斜杠。或者,更简单的是,对所有Windows样式的路径名使用原始字符串。或者,更简单的是,如果您使用的功能甚至在Windows上允许POSIX样式的路径名,只需使用它们即可。换句话说,以下之一:

"C:\directory\\b1.mp3"
"C:\\directory\\b1.mp3"
r"C:\directory\b1.mp3"
"C:/directory/b1.mp3"

最重要的是,如果您使用旧版PyQt,则无法通过这种方式调用静态Qt方法。换句话说,您不是调用QSound::play(filename)静态方法,而是调用QSound::play()实例(插槽)方法。在以后的版本中,这应该没问题 - 尽管正如文档所说,构建QSound并调用其play方法"可能......立即播放",所以你可能想要无论如何要这样做。

如果您遇到此问题,解决方法是:

QSound(r"C:\directory\b1.mp3").play()

虽然在实际代码中,您可能希望保留大部分QSound个对象,而不是每次都重新创建它们。


在评论中,您说:

  

我发现QSound实际上不支持资源。不幸的是,我不知道这意味着什么,也许你可以解释这对我的代码意味着什么。

对你的代码来说,这并不意味着什么,至少今天不是。您已经在常规文件中获得了声音,并且您尝试通过绝对路径名访问这些文件。

但如果你想在将来改进你的应用程序,可能会妨碍你。

资源在The Qt Resource System中解释。我们的想法是,您只需拥有一个像MyApp.exe这样的可执行文件,而不是为图像等提供一堆单独的文件,而是将所有资源文件塞进该可执行文件中。在运行时,您仍然可以访问这些资源,就像它们仍然是单独的文件一样。您只需使用:/sounds/b1.mp3之类的特殊路径(或者,更好的是,从路径名切换到网址,并使用qrc:///sounds/b1.mp3等特殊网址。)

踢球者就是"几乎"。一些功能不直接在资源上工作,因此如果要使用这些功能,则必须将资源显式提取到临时文件。