2012-11-13 73 views
5

我正在玩一个构建像鼓机一样播放节奏的python脚本。我用PyGame来处理音频。但是,我在播放和听到实际音频之间遇到了显着/不可接受的延迟。PyGame在播放声音时有巨大的延迟

我粘贴下面的代码到交互式解释,然后一次又一次地执行的最后一行:

import pygame 
pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=4096) 
s = pygame.mixer.Sound('snare.wav') 
s.play(loops=0, maxtime=0, fade_ms=0) 

之间按下Enter键,听到的声音是我最好的猜测围绕400ms的,确实的时间显而易见且不可接受的。延迟大致与单击VLC中的播放按钮并等待音频播放相同。

我已经在Windows和Ubuntu上都尝试了这个,结果相同。我的电脑有点旧,英特尔酷睿i3 2.53GHz,但我认为这不应该是一个问题。

我该怎么办?

在循环:

此代码演示相同滞后。

for i in range(10): 
    print i 
    s.play(loops=0, maxtime=0, fade_ms=0) 
    sleep(2) 
+0

1)也许在解释器本身的延迟?尝试'raw_input(); s.play(loops = 0,maxtime = 0,fade_ms = 0)',然后再次按Enter。 2)圈套是从声音文件的一开始就开始的吗?如果您在Audacity中打开文件,开始和实际声音之间有多少时间? –

+0

1)没有区别。 2)实际的声音确实在波形文件中立即开始。我也试过用其他wave文件。 –

+0

你可以发布一个链接到声音文件,我想用我的机器测试这个 –

回答

8

一个可能的解决方案是降低缓冲区的大小(例如512):

import pygame 
pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=512) 
s = pygame.mixer.Sound('snare.wav') 
s.play(loops=0, maxtime=0, fade_ms=0) 
1

我有同样的问题在几分钟前,并有在This other thread

对我的作品的解决方案

它看起来像一个初始化问题,如果你首先启动pygame(或者XD),pygame不能很好地获得缓冲区。首先初始化混频器init()和pre_init(),并从那里实验:

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

这应该工作:)祝你好运!