繁体   English   中英

使用PyGame播放音频文件时的时间安排不正确

[英]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在很大范围内,问题仍然存在。 因此,问题并非出自它试图重播同一文件的事实

原因如下:

在此处输入图片说明

即使我们将音频缓冲区减小到声卡支持的最小值(1024或512个样本,而不是pygame的默认4096),差异仍然存在,从而使“节拍器节奏”变得不规则。

找到一个解决方案后,我将立即更新。 (我对此有一些想法)。

正如您在自己的答案中所写的那样,计时问题的原因很可能是音频回调与应用程序其余部分分离的事实。

音频后端通常具有某种时钟,可从回调函数内部和外部对其进行访问。 我看到两种可能的解决方案:

  1. 使用一个库,该库允许您自己实现回调函数,计算回调函数中声音的开始时间,将这些时间与“音频时钟”的当前时间进行比较,然后将声音写入输出中的适当位置输出缓冲区。

  2. 使用一个允许您指定开始播放声音的确切时间的库(以“音频时钟”为单位)。 该库将为您完成上一点的步骤。

对于第一个选项,您可以使用声音设备模块。 回调函数(您将必须实现)将获得一个名为time的参数,该参数具有time.outputBufferDacTime属性,这是一个浮点值,指定输出缓冲区的第一个样本将被time.outputBufferDacTime的时间(以秒为单位)。播放了。

完全公开:我是sounddevice模块的作者,因此我的建议颇有偏见。

最近,我开始研究rtmixer模块,该模块可用于第二个选项。 请注意,它处于非常早期的开发状态,因此请谨慎使用。 使用此模块,您无需编写回调函数,可以使用函数rtmixer.Mixer.play_buffer()在指定的时间(以秒为单位)播放音频缓冲区。 作为参考,您可以从rtmixer.Mixer.time获取当前时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM