python – pygame.mixer.Sound.play虽然经常被解雇但是不规则
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – pygame.mixer.Sound.play虽然经常被解雇但是不规则,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2327字,纯文字阅读大概需要4分钟。
内容图文
![python – pygame.mixer.Sound.play虽然经常被解雇但是不规则](/upload/InfoBanner/zyjiaocheng/767/458ece58fea74390b98b3c82b364ca8e.jpg)
我目前尝试每隔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从脚本中记录的波形:
你看,由于某些原因,一些样本的播放时间比其他样本长.对于我想要构建的某种节拍器来说不是很好.
编辑更新:
这不是pygame.time.set_timer的问题,因为这段代码不能解决问题而且不依赖于pygame.time.set_timer:
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)循环它.
如果只有少数有效间隔,则可能最容易
存储专用的声音文件并加载适当的声音文件.
否则,pygame.sndarray模块提供访问权限
原始声音数据的numpy阵列,这使得它成为可能
动态生成所需长度的声音对象:
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),这种方法应该有一个很好的机会进行准确的播放.
内容总结
以上是互联网集市为您收集整理的python – pygame.mixer.Sound.play虽然经常被解雇但是不规则全部内容,希望文章能够帮你解决python – pygame.mixer.Sound.play虽然经常被解雇但是不规则所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。