Python 和准确的时间
Python and accurate timing
我正在尝试编写一些代码来使用 python 播放声音。具体来说,我有一些教堂钟声的录音,我正试图以特定的顺序播放它们以重现教堂钟声的声音。目前我正在使用 pygame 来处理计时和播放,如下所示:
import pygame.mixer as mx
import pygame.time as tm
mx.init()
sounds = [mx.Sound('./data/bell-{0}.wav'.format(i)) for i in range(1,9)]
def round():
for i in range(8):
sounds[i].play()
tm.delay(250)
for i in range(3):
round()
round()
tm.wait(250)
mx.quit()
这应该演奏类似 'ringing rounds' 的东西,一个常规演奏的音阶,每个铃声间隔 250 毫秒,每个音阶之后有 250 毫秒的额外间隔。
但是我得到的东西很不平衡,即使我运行python和nice -n -19 python rounds.py
一样。时间的变化有点难以估计,但我猜它经常超过 100 毫秒,偶尔超过 200 毫秒。
如果我将声音文件导入 Audacity 并且 space 它们相隔 250 毫秒,我会得到一个漂亮、均匀的比例,所以问题不仅仅是声音文件编辑不均匀。
我怎样才能改善这个时间安排?在我看来,准确的计时在游戏库中应该非常重要,尤其是当负载很轻时(如本例)。
将 pygame.mixer.pre_init(44100, -16, 1, 512)
放在 mx.init()
之前。
我正在尝试编写一些代码来使用 python 播放声音。具体来说,我有一些教堂钟声的录音,我正试图以特定的顺序播放它们以重现教堂钟声的声音。目前我正在使用 pygame 来处理计时和播放,如下所示:
import pygame.mixer as mx
import pygame.time as tm
mx.init()
sounds = [mx.Sound('./data/bell-{0}.wav'.format(i)) for i in range(1,9)]
def round():
for i in range(8):
sounds[i].play()
tm.delay(250)
for i in range(3):
round()
round()
tm.wait(250)
mx.quit()
这应该演奏类似 'ringing rounds' 的东西,一个常规演奏的音阶,每个铃声间隔 250 毫秒,每个音阶之后有 250 毫秒的额外间隔。
但是我得到的东西很不平衡,即使我运行python和nice -n -19 python rounds.py
一样。时间的变化有点难以估计,但我猜它经常超过 100 毫秒,偶尔超过 200 毫秒。
如果我将声音文件导入 Audacity 并且 space 它们相隔 250 毫秒,我会得到一个漂亮、均匀的比例,所以问题不仅仅是声音文件编辑不均匀。
我怎样才能改善这个时间安排?在我看来,准确的计时在游戏库中应该非常重要,尤其是当负载很轻时(如本例)。
将 pygame.mixer.pre_init(44100, -16, 1, 512)
放在 mx.init()
之前。