【发布时间】:2019-01-17 13:21:13
【问题描述】:
我正在尝试在 Raspberry Pi 上制作一个非常简单的节拍器,该节拍器以设定的间隔播放 .wav 文件,但时间听上去不准确。 实在想不通,是不是python的时间模块不准确?
我不认为处理播放音频的代码是瓶颈,因为如果我把它放在一个没有计时器的循环中,它会一直发出嘎嘎声。 使用下面的简单代码,声音会以节拍播放几次,然后随机关闭一个节拍,一遍又一遍。
import pygame
from time import sleep
pygame.mixer.pre_init(44100, -16, 2, 2048)
pygame.mixer.init()
pygame.init()
BPM = 160
sound = pygame.mixer.Sound('sounds/hihat1.wav')
while True:
sound.play()
sleep(60/BPM)
我希望声音每 X 毫秒重复一次,精度至少为 +/-10 毫秒左右。这不现实吗?如果是这样,请提出替代方案。
【问题讨论】:
-
也许用不同的音频文件试试?只是为了确保
sounds/hihat1.wav的某个地方没有问题。 -
我做了,不幸的是同样的问题
-
嗯...也许可以试试
sleep(60/BPM - sound.get_length()),以便暂停占音频文件的长度 -
这几乎是 stackoverflow.com/questions/28528935/… 和 stackoverflow.com/questions/26563033/… 的重复 - 不是 exact 重复,所以我暂时不投票关闭,但如果你找到其中之一链接解决了您的问题,请发表评论,以便我们将其作为重复项关闭。
-
附带说明:
sleep()绝对是不是时间关键代码的正确工具,参见文档 (docs.python.org/2/library/time.html#time.sleep):“他实际的暂停时间可能小于请求的值,因为任何捕获的信号都将在执行该信号的捕获例程后终止 sleep()。此外,由于系统中其他活动的调度,暂停时间可能比请求的长任意数量。"
标签: python raspberry-pi pygame timing pyaudio