python - 使用Pyqt4和QSound播放声音

标签 python qt audio pyqt4

为了简短起见,经过数小时的寻找在pyqt4中播放声音的方法之后,我仍然不明白为什么这个简单的小代码无法正常工作?我没有收到任何错误消息,但没有声音(我尝试过mp3,ogg和wav),但是我只是得到了一点Windows“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()

最佳答案

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

首先,如果要使用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对象,而不是每次都重新创建它们。

在评论中,您说:

I found out that QSound actually does not support resources. Unfortunately I have no clue what that means, maybe you could explain what that means for my code.



这对您的代码没有任何意义,至少在今天没有。您已将声音保存在常规文件中,并尝试通过绝对路径名访问这些文件。

但是,如果您想在将来改进应用程序,可能会遇到麻烦。

资源在The Qt Resource System中说明。这个想法是,您没有像图像等那样拥有一堆单独的文件,而只有一个可执行文件,例如MyApp.exe,所有资源文件都挤在了该可执行文件中。在运行时,您仍然可以访问这些资源,就像它们仍然是单独的文件一样。您只需使用诸如:/sounds/b1.mp3之类的特殊路径(或者更好的是,从路径名切换为URL,并使用诸如qrc:///sounds/b1.mp3之类的特殊URL)。

关键是那个“差不多”。某些功能无法直接在资源上使用,因此,如果要使用这些功能,则必须将资源显式提取到临时文件中。

关于python - 使用Pyqt4和QSound播放声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15750865/

相关文章:

python - BeautifulSoup:将内容 [] 作为单个字符串获取

python - 如何测试这个 Flask 应用程序中的功能 - 编写单元测试?

"row height changed"的 QTableView 信号或事件

c++ - 将 bool 转换为 QString

c++ - QHash - 热获取随机键和值

c++ - 如何将ROS AudioData消息写入wav文件?

audio - 如何在Inno Setup(返回+下一步+取消)中单击按钮时自定义单击声音?

python - 使 MoviePy 中的文本在宽度和高度之间自动调整大小作为 TextClip

python - 使用列表推导式,将字符串中的所有元音转换为大写?

javascript - Angular 7 Service Worker缓存音频文件导致Safari出现范围 header 问题