Pygame - 声音延迟

Posted

技术标签:

【中文标题】Pygame - 声音延迟【英文标题】:Pygame - Sound delay 【发布时间】:2013-08-16 12:48:25 【问题描述】:

我创建了一个按钮类来检查按钮是否被选中(当鼠标悬停在按钮上时)。当按钮被选中、取消选中或单击时,它会播放一个 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()

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我的声音仍然滞后。 我也是,虽然它从 0,4 秒减少到 0,3 秒。仍然想知道为什么会出现延迟。 太棒了!这成功了!我不知道是否完全没有延迟,但我听不到像以前那样的延迟。【参考方案2】:

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

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

但是,如果您在初始化 pygame 本身之前初始化混音器,它将消除所有延迟。这解决了我所有的延迟问题。希望有帮助。

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

【讨论】:

【参考方案3】:

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

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

更多信息请访问pygame docs

【讨论】:

【参考方案4】:

简单地减小缓冲区的大小,正如经常针对这个问题所建议的那样,对我没有用。我找到了this 解决方案。启动混合器两次时,延迟完全消失:

import pygame

pygame.mixer.pre_init(22050, -16, 2, 1024)
pygame.init()
pygame.mixer.quit()
pygame.mixer.init(22050, -16, 2, 1024)

它有点脏,我不知道它为什么会起作用,但希望它能为某些人解决问题。

使用 Python 3.6pygame 1.9.4

Ubuntu 16.04 LTS 上测试

【讨论】:

类似地,虽然减小缓冲区大小不起作用,但这样做了。有人知道为什么吗? 谢谢!这成功了。超级奇怪:)【参考方案5】:

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

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

使用pg.mixer.pre_init(22100, -16, 2, 64),声音播放得更快,但会扭曲,适合音效,但不适合作为背景的真实音乐。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于Pygame - 声音延迟的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PyGame 在延迟或睡眠之前没有在窗口中绘制?

如何在 pygame 中连续生成和跟踪多个具有时间延迟的随机对象? [复制]

无延迟播放声音 iOS

添加到声音的延迟

如何以绝对最小或*量化*延迟播放声音?

使用 AVAudioPlayer 延迟播放声音