python – pygame.mixer.Sound.play虽然经常被解雇但是不规则
发布时间:2020-12-20 13:15:36 所属栏目:Python 来源:网络整理
导读:我目前尝试每隔x ms重复一次声音 – 其中x依赖于我通过套接字接收的UDP数据包 – 我决定使用pygame.我用这个SO答案每隔x ms重复一次: https://stackoverflow.com/a/18954902/3475778 但现在我遇到了问题,声音播放非常不规律,并且问题仍然存在的最小工作示例
我目前尝试每隔x ms重复一次声音 – 其中x依赖于我通过套接字接收的UDP数据包 – 我决定使用pygame.我用这个SO答案每隔x ms重复一次:
https://stackoverflow.com/a/18954902/3475778
但现在我遇到了问题,声音播放非常不规律,并且问题仍然存在的最小工作示例: import pygame from pygame.locals import * pygame.mixer.init() sound = pygame.mixer.Sound('sound.wav') def play_sound(): sound.stop() sound.play() pygame.init() clock = pygame.time.Clock() pygame.time.set_timer(USEREVENT+1,200) while True: # clock.tick(30) for event in pygame.event.get(): if event.type == USEREVENT+1: play_sound() 以下是我通过Audacity从脚本中记录的波形: 你看,由于某些原因,一些样本的播放时间比其他样本长.对于我想要构建的某种节拍器来说不是很好. 编辑更新: import pygame from datetime import datetime d = datetime.now() pygame.mixer.init() sound = pygame.mixer.Sound('horn_short.wav') pygame.init() while True: if (datetime.now() - d).total_seconds() > 0.2: sound.play() d = datetime.now() 有同样的问题.问题也出现在Ubuntu 16.04,Python 3.5 64bit(Anaconda)和全新安装的pygame下. 解决方法
这是另一种方法的想法.
如果目标是定期播放声音, 如果你(动态地)将声音填充到所需的间隔长度,你可能会得到更好的结果, 然后简单地用 Sound.play(loops=-1) 循环它.
如果只有少数有效间隔,则可能最容易 否则, import pygame import numpy # Helper function def getResizedSound(sound,seconds): frequency,bits,channels = pygame.mixer.get_init() # Determine silence value silence = 0 if bits < 0 else (2**bits / 2) - 1 # Get raw sample array of original sound oldArray = pygame.sndarray.array(sound) # Create silent sample array with desired length newSampleCount = int(seconds * frequency) newShape = (newSampleCount,) + oldArray.shape[1:] newArray = numpy.full(newShape,silence,dtype=oldArray.dtype) # Copy original sound to the beginning of the # silent array,clipping the sound if it is longer newArray[:oldArray.shape[0]] = oldArray[:newArray.shape[0]] return pygame.mixer.Sound(newArray) pygame.mixer.init() pygame.init() sound = pygame.mixer.Sound('sound.wav') resizedSound = getResizedSound(sound,0.2) resizedSound.play(loops=-1) while True: pass 使用pygame(和numpy),这种方法应该有一个很好的机会进行准确的播放. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |