Pygame无法打开声音文件。

12
import pygame, time
from pygame.locals import *

soundObj = pygame.mixer.Sound('beeps.wav')
soundObj.play()

time.sleep(1) # wait and let the sound play for 1 second
soundObj.stop()

并且它会报出这个错误:

Traceback (most recent call last):
  File "C:/Users/Jauhar/Desktop/Python/sounds.py", line 4, in <module>
    soundObj = pygame.mixer.Sound('beeps.wav')
pygame.error: Unable to open file 'beeps.wav'

beeps.wav文件保存在与Python代码相同的目录中。

我不明白为什么它不起作用!

8个回答

12

Pygame(至少版本2.9)不支持32位浮点数的WAV文件。请重新编码为有符号16位的WAV(例如使用Audacity)。


如果你的OGG失败了,尝试使用WAV格式,因为WAV比OGG更受支持。 - astralwolf

9

如果你想使用pygame库,就必须初始化你所使用的模块或全部模块。

    pygame.mixer.pre_init(44100, 16, 2, 4096) #frequency, size, channels, buffersize
    pygame.init() #turn all of pygame on.

在使用pygame之前,先执行以下操作。我建议这么做。

可能是格式或格式中不支持的功能。Pygame的灵活性相当有限,找到可行的方法可能会非常受限制。我现在只使用pygame来处理事件和OpenGL窗口。如果我再次需要处理声音,我可能会使用OpenAL。 - Kaliber64
1
结果发现pygame的频率太高了,所以我使用了其中一个免费工具来降低采样率(到大约128 bps),然后它就可以正常工作了。 - Alex
@Kaliber64,“pygame 频率过高”是什么意思?这个限制真的是由于 pygame 还是计算机 CPU? - ThePhi
44100 是标准输出质量。所有来自文件的输入都将受到此输出的限制。只要 Pygame muxer(我认为这是正确的术语)可以处理您提供的文件,声音就会正常工作。不幸的是,我不知道它的限制。现在,所有不到10年的硬件都不应该限制 pygames 声音库的功能,因此不必担心计算机的 CPU。 - Kaliber64
如果音频文件的采样率为16000Hz,那么在pygame.mixer.pre_init(44100, 16, 2, 4096)中应该设置什么频率? - Athulya

0

尝试记录这些信息,你可能会找到问题的所在。

import os
os.getcwd() # Log this line.
soundObj = pygame.mixer.Sound('beeps.wav')

这应该告诉你当尝试访问声音文件时,你的应用程序正在查找哪个目录。你可能会发现它位于游戏目录的根目录。


嘿,感谢你的帮助。我将代码修改为以下内容:`import pygame, time, os from pygame.locals import *print(os.getcwd()) # 记录这一行 soundObj = pygame.mixer.Sound('beeps.wav') soundObj.play()time.sleep(1) # 等待并让声音播放1秒钟 soundObj.stop()`你说得对,它正在查看我的游戏目录底部的位置。然而,我仍然不确定如何解决我的问题,因为一切似乎仍然按照预期工作。 - user2066880
你需要初始化pygame。请参考kaliber的答案。如果你需要使用子目录,请使用filename = os.path.join("sounds", "beeps.wav") - ninMonkey

0
这对我有用:
pygame.mixer.init() 

0

刚遇到了同样的问题,将WAV文件中的ID标签删除后问题得以解决。因此,值得检查一下文件是否有ID标签!


0
在pygame.init()之后添加声音文件。我曾经遇到过这个问题,但是在添加了声音文件之后,它就可以正常工作了。

附上一些示例代码会更有帮助。 - darthShadow

0

我遇到了类似的问题,发现 .wav 文件的大小对问题有影响。将 .wav 文件变小后,就可以在不进行重大修改的情况下正常运行。


0
如果在播放声音之前创建一个显示表面,那么相同的程序对我来说是有效的。
    #! Python 3
'''
Making games with python chapter 2 program 5
'''
import pygame, sys, time
from pygame.locals import*

pygame.init()
DISPLAYSURF = pygame.display.set_mode((400, 300))
pygame.display.set_caption("Sound!!")

soundObj = pygame.mixer.Sound('badswap.wav')
soundObj.play()
time.sleep(1) #wait and let the sound play for X second
soundObj.stop()

while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
        pygame.display.update()

我确认了。怎么可能? - Devernay Stéphane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接