- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前尝试每隔 x 毫秒重复一次声音 - 其中 x 取决于我通过套接字接收的 UDP 数据包 - 我决定为此使用 pygame。我用这个 SO 答案每隔 x 毫秒重复一次: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 64 位(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 是不规则的,尽管是定期触发的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41321052/
pygame.mixer init 和 pygame.mixer pre init 有什么区别?我看了一个教程,他用的是pre-init,但是解释的不是很清楚。我应该只使用 mixer init,还是
即使在空白程序中,如果我键入代码行, pygame.mixer.init() PyCharm 抛出错误, NotImplementedError: mixer module not availab
我正在尝试使用Python制作自己的音乐播放器,并且在研究了其他选择之后,我决定使用pygame的mixer.music实际播放音频。 (我以前使用过pygame,通常是在实际游戏中使用),而我一直在
我正在尝试使用“cabal install sdl-mixer”来安装 SDL-mixer haskell 软件包。当我这样做时,它给出了错误 Resolving dependencies... [1
我有一个支持 Istio 的 EKS 集群,但我的节点经常出现磁盘空间不足的情况。 计算总体磁盘使用情况后,我找到了 istio-mixer 容器,该容器的日志文件仅在 12 天内就使用了超过 50G
我正在尝试为 friend 制作一个小程序,它需要运行一个 .wav 文件当我在 python 中运行它时它工作正常但是当我在 py2exe 中编译它时它给了我这个 --> phone.exe:23:
使用 pygame 混音器,我打开一个音频文件并对其进行操作。我找不到将“声音对象”保存到磁盘上的本地文件的方法。 sound_file = "output.mp3" sound = pygame
当我尝试运行以下代码时,我没有收到任何错误或声音。声音文件没有损坏,我也尝试了许多其他声音文件。 import pygame pygame.mixer.init(44100, -16, 2, 2048
我使用了以前的堆栈溢出帖子来帮助我开发以下代码: import os import pygame from pygame import * import sys GAME_FOLDER = os.pa
我想为我的神经科学研究生成一系列特定频率和持续时间的音频提示。经过一番谷歌搜索,我发现一个名为 Pygame 的 Python 模块似乎能够完成这项工作。 sound = pygame.sndarra
我几乎已经完成了我的示例游戏,这是我的回避游戏,设置完毕,无论有没有背景音乐,游戏都运行得很好,但是,当我尝试添加游戏结束声音时,python 提示以下错误 Traceback (most recen
我一直在使用 pygame.mixer 开发一个与声音相关的 Pygame 项目,但我遇到了一个似乎无法解决的问题。我无法打开我尝试过的任何声音文件(.mp3 和 .midi)。 我在 PyCharm
我有俄语 Windows 7,其中一些设备以俄语命名。如果我通过 AudioSystem.getMixerInfo() 获得诸如混音器之类的设备,我会将 Mixer.Info.getName() 错误
我创建了以下使用 pygame.mixer 播放 mp3 音乐的代码。但是,音乐不会重复。关于如何使音乐重复播放的任何想法?这是代码: playlist = list() playlist.appen
我试图让 Java 在两个输出(正面和背面音频插孔)中播放不同的立体声音频。 我的声卡配置为独立处理两个输出,在 Windows 混音器中我可以让它们分别发出测试声音,所以这不是卡问题。 我在 Cha
所以我有一个将我的 .wav 文件加载到内存中的存档,我正在尝试从 void* 或内存中的句柄播放 .WAV。 II 不能在目录中包含所有 .wav 文件,我有一个将它们加载到内存中的函数。 这是我正
我正在尝试寻找支持麦克风耳机插孔的特定混音器。请让我知道我的代码中做错了什么。我不完全明白我需要做什么。 Mixer.Info[] mixerInfo = AudioSystem.getMix
我正在用 pygame 制作贪吃蛇游戏,我想了解一些关于 pygame.mixer.music() 的知识。 代码: snakebodypos.insert(0, list(snakepos)) if
如何使用pygame选择某首歌曲进行播放?我将它们放入列表中,但以下代码不起作用。当我运行该应用程序时,它打印“无”,当我取消对 pygame.mixer.music.play 的注释时,该应用程序给
这个问题已经有答案了: How do I schedule an audio file to play automatically in pygame after the first song end
我是一名优秀的程序员,十分优秀!