Pygame - 声音延迟

时间:2013-08-16 12:48:26

标签: python pygame

我制作了一个按钮类,用于检查是否选择了按钮(当鼠标悬停在按钮上时)。选择,未选中或单击按钮时,它将播放一个wav文件。问题是声音播放和按钮状态变化之间存在巨大延迟。该程序应检查每一帧,看看是否已满足播放声音的条件,但fps似乎不是问题(60和600 fps给出相同的延迟)。我已经尝试减少pygame.mixer.init()中的缓冲区值,但这也没有显示出差异。

声音文件:

buttonSoundSelect = pygame.mixer.Sound(os.path.join(soundPath, "button1.wav"))
buttonSoundUnselect = pygame.mixer.Sound(os.path.join(soundPath, "button2.wav"))
buttonSoundClick = pygame.mixer.Sound(os.path.join(soundPath, "button3.wav"))
buttonSounds = [buttonSoundSelect, buttonSoundUnselect, buttonSoundClick]

创建对象:

playButton = button(textInactive = "Play", font = mainFont, sounds = buttonSounds,  command = playAction)

来自按钮类的代码,用于检查按钮是否被选中(这是在每帧调用的方法.display内):

    if pygame.mouse.get_pos()[0] >= self.x and pygame.mouse.get_pos()[0] <= self.x + self.width and \
       pygame.mouse.get_pos()[1] >= self.y and pygame.mouse.get_pos()[1] <= self.y + self.height:

        self.surfaceActive.blit(self.textSurfaceActive, (self.width / 2 - self.font.size(self.textActive)[0] / 2,
                                                   self.height / 2 - self.font.size(self.textActive)[1] / 2))

        self.surface.blit(self.surfaceActive, (self.x, self.y))

        if self.selected == False:
            if self.sounds != None:
                self.sounds[0].stop()
                self.sounds[1].stop()
                self.sounds[2].stop()
                self.sounds[0].play()
            self.selected = True

    else:

        self.surfaceInactive.blit(self.textSurfaceInactive, (self.width / 2 - self.font.size(self.textInactive)[0] / 2,
                                                     self.height / 2 - self.font.size(self.textInactive)[1] / 2))

        self.surface.blit(self.surfaceInactive, (self.x, self.y))

        if self.selected == True:
            if self.sounds != None:
                self.sounds[0].stop()
                self.sounds[1].stop()
                self.sounds[2].stop()
                self.sounds[1].play()
            self.selected = False

按钮类中的代码,用于检查是否单击了按钮(这是在单击鼠标左键时调用的方法.clickEvent内):

    if self.command != None:

        if pygame.mouse.get_pos()[0] >= self.x and pygame.mouse.get_pos()[0] <= self.x + self.width and \
           pygame.mouse.get_pos()[1] >= self.y and pygame.mouse.get_pos()[1] <= self.y + self.height:    

            if self.sounds != None:
                self.sounds[2].play()
            self.command()

所以我的问题是: 为什么会有很长的延迟,我可以缩短它吗?

6 个答案:

答案 0 :(得分:11)

我也有声音滞后的问题。我发现在pygame.mixer.pre_init()之前调用pygame.init()解决了我的问题:

pygame.mixer.pre_init(44100, -16, 1, 512)
pygame.init()

答案 1 :(得分:10)

我知道这已经过时了,但我找到了迄今为​​止我见过的最佳解决方案。

实际上修复非常简单。我曾经一直延迟我的pygame项目,因为我会在初始化混音器之前初始化pygame。 (这似乎总是你应该对我这样做的方式)。

但是如果你在初始化pygame本身之前初始化混音器,它就会摆脱所有的延迟。这解决了我所有的延迟问题。希望它有所帮助。

pygame.mixer.pre_init(44100, -16, 2, 2048)
pygame.mixer.init()
pygame.init()

答案 2 :(得分:2)

减小缓冲区的大小将减少延迟。缓冲区必须是2的幂。默认缓冲区为4096,但您可以在初始化混合器时更改它,如下所示:

pygame.mixer.init(22100, -16, 2, 64)

可以在pygame docs

上找到更多信息

答案 3 :(得分:2)

我也有一个声音延迟。现在,这对我来说很好:

pg.mixer.pre_init(44100, -16, 1, 512)
pg.init()
pg.mixer.init()

使用pg.mixer.pre_init(22100, -16, 2, 64)声音播放速度更快但声​​音扭曲,声音效果更好,但真实音乐不适合背景。

答案 4 :(得分:1)

在我的情况下,延迟在0.2到0.5秒之间。 调用pygame.mixer.pre_init()是一个非常好的解决方案,但延迟也取决于给定的值。

答案 5 :(得分:1)

找到另一个发布的答案 question,建议更改缓冲区大小。