[英]Bad timing when playing audio files with PyGame
当我使用PyGame每0.5秒播放一次声音时:
import pygame, time
pygame.mixer.init()
s = pygame.mixer.Sound("2.wav")
for i in range(8):
pygame.mixer.Channel(i).play(s)
time.sleep(0.5)
它根本没有正确地遵守时间。
就像有0.2秒的暂停,而不是0.7秒的暂停,然后又是0.2秒的暂停一样,这非常不规律。
笔记:
我知道time.sleep()
是不是在世界上最精确的,但即使有更准确的解决方案, 从这里 ,问题仍然存在
在RaspberryPi上测试
如果我播放许多不同的文件s[i].play()
,而i在很大范围内,问题仍然存在。 因此,问题并非出自它试图重播同一文件的事实
正如您在自己的答案中所写的那样,计时问题的原因很可能是音频回调与应用程序其余部分分离的事实。
音频后端通常具有某种时钟,可从回调函数内部和外部对其进行访问。 我看到两种可能的解决方案:
使用一个库,该库允许您自己实现回调函数,计算回调函数中声音的开始时间,将这些时间与“音频时钟”的当前时间进行比较,然后将声音写入输出中的适当位置输出缓冲区。
使用一个允许您指定开始播放声音的确切时间的库(以“音频时钟”为单位)。 该库将为您完成上一点的步骤。
对于第一个选项,您可以使用声音设备模块。 回调函数(您将必须实现)将获得一个名为time
的参数,该参数具有time.outputBufferDacTime
属性,这是一个浮点值,指定输出缓冲区的第一个样本将被time.outputBufferDacTime
的时间(以秒为单位)。播放了。
完全公开:我是sounddevice
模块的作者,因此我的建议颇有偏见。
最近,我开始研究rtmixer模块,该模块可用于第二个选项。 请注意,它处于非常早期的开发状态,因此请谨慎使用。 使用此模块,您无需编写回调函数,可以使用函数rtmixer.Mixer.play_buffer()
在指定的时间(以秒为单位)播放音频缓冲区。 作为参考,您可以从rtmixer.Mixer.time
获取当前时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.