在使用pygame音频播放时,我注意到延迟时间很长(>100 ms):
import pygame
pygame.init()
pygame.mixer.init()
sounda = pygame.mixer.Sound("test.wav")
def callback()
sounda.play()
# callback is called by another function, but I could measure a high latency (> 100ms)pygame是延迟的原因吗?更普遍地说,是否可以用Python实现低延迟音频播放?
应用程序示例:当MIDI消息从MIDI键盘到达时,播放一些.wav文件。(我想编写一个非常基本的音乐采样器)。当然,延迟将在很大程度上取决于音频接口(ASIO或非ASIO,等等),但我现在想分析Python是否有可能降低附加延迟,如果可能,为此目的首选哪些模块。
发布于 2013-12-10 21:59:58
游戏是导致延迟的原因吗?
可能不会。
Pygame只是SDL的一个包装器。在某些领域--比如这个--这是一个非常薄的包装。
但SDL--或者说,更确切地说,SDL_mixer-could--很容易成为问题所在。
因此,您可能需要了解一些关于SDL的知识,才能将pygame用于超出通常游戏风格需求的音频。Audio with SDL是一个不错的概述,尽管它似乎有点过时。
首先要考虑的是您使用的是什么音频驱动程序。例如,在许多linux系统上,ALSA不能做低延迟声音,这意味着您编写的任何最终与ALSA对话的内容也不能做到这一点。如果您的系统被设置为使用esd或其他声音守护进程(如果可能的话),并且在必要时返回,那么您显然不想在这里这样做。因此,如果这是您的问题,您将不得不配置SDL_mixer使用不同的驱动程序。
假设驱动程序能够处理它,那么肯定可以使用pygame.mixer/SDL_mixer进行低延迟声音。但它可能无法发挥作用。
您要做的第一件事是选择一个比默认缓冲区更小的缓冲区大小。
还请注意,如果声音与目标的采样速率/等等不同,SDL_mixer将自动在后台对它们进行重新编码,这不仅会增加CPU工作的延迟,还意味着真正的缓冲区大小与您认为正在使用…的声音无关。
另一种替代方法是绕过pygame.mixer/SDL_mixer,进行混合,然后直接到pygame.sound/SDL_sound。这仍然会有相同的驱动程序问题,但是任何由SDL_mixer引起的问题(比如重新编码)都会消失。
如果您不能让pygame/SDL做您想做的事情(例如,因为它在您的系统上支持的唯一驱动程序都很糟糕),那么您将不得不使用不同的库。wiki上的PythonInMusic有数百个链接,您也可以搜索PyPI。但是,您可能希望从另一边开始--找到您想要使用的C音频库,然后为它搜索Python绑定。例如,pyAudio是PortAudio的一个相对较薄的包装器,因此如果PortAudio的可移植性、可配置性和性能要求满足您的需要,并且它的API适合您的设计,那么它就会受到影响,但否则会很糟糕。
另一个可能出错的地方是代码中。
这显然不是你的情况下的问题,因为你所做的只是给pygame.mixer一个预先制作的声音。但是,如果您决定需要预先将声音和提要缓冲区转换为pygame.sound,您可能会遇到这样的问题: Python循环缓慢,算术慢。
我所说的“慢”是指微秒的顺序。每20 is缓冲区循环一次并不是问题。每个样本循环一次可能是。如果您正在进行任何处理,您应该考虑使用NumPy或专用的音频库来完成繁重的工作,而不是使用纯Python。
https://stackoverflow.com/questions/20503978
复制相似问题