使用 Pyqt4 和 QSound 播放声音
Posted
技术标签:
【中文标题】使用 Pyqt4 和 QSound 播放声音【英文标题】:Playing sound with Pyqt4 and QSound 【发布时间】:2013-04-01 20:02:45 【问题描述】:为了简短起见,经过数小时寻找在 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()
【问题讨论】:
python 不能使用 C 字符串吗?你不打算写“C:/directory/b1.mp3”吗? @Amartel:“C 弦”是什么意思? Python 使用 Python 字符串,这是一个完全有效的字符串。此外,您可以在大多数 API 中使用本机路径名,并且在某些情况下需要这样做。 【参考方案1】:您可能会遇到两个不同的问题。
首先,如果您想使用 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
这样的特殊路径(或者,最好从路径名切换到 URL,并使用像 qrc:///sounds/b1.mp3
这样的特殊 URL)。
最重要的是“几乎”。一些功能不能直接作用于资源,因此如果您想使用这些功能,您必须将资源显式提取到临时文件中。
【讨论】:
好的。修改很多哈哈。但我仍然没有真正澄清。我从你的回答中得到的是我必须将 QSound.play("C:\a\b\c\d\b1.mp3") 更改为 QSound("C:\a\b\c\d\\b1 .mp3").play() 仍然无法正常工作 好吧,在"C:\a\b\c\\b1.mp3"
中,您添加了另一个未转义的\b
,所以您又遇到了同样的问题。这就是为什么我建议只使用原始字符串或 POSIX 样式的路径比试图弄清楚你做什么或不需要转义要简单得多。
我发现QSound其实是不支持资源的。不幸的是,我不知道这意味着什么,也许你可以解释一下这对我的代码意味着什么。
我相信Qt5支持声音资源,但Qt4不支持。请参阅the docs 以确保每个版本。但这对您的用例无关紧要。我在答案中添加了一些内容来解释原因。以上是关于使用 Pyqt4 和 QSound 播放声音的主要内容,如果未能解决你的问题,请参考以下文章
声音未正确播放,嗡嗡声而不是录制的声音 - Portaudio
用 Qt 的 QAudioOutput 类播放 WAV 音频文件(使用了libsndfile外部库)