Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

6年前关闭。



Improve this question




使用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文件。 (我想编写一个非常基本的音乐采样器)。
当然,延迟将在很大程度上取决于音频接口(interface)(ASIO或非ASIO等),但是我现在想分析一下Python是否可能实现较低的附加延迟,如果可以,那么哪些模块更适合此目的。

最佳答案



可能不会。

Pygame只是SDL的包装。在某些区域(例如这样的区域),它的包装很薄。

但是SDL或SDL_mixer可能很容易成为问题。

因此,您可能需要学习一些有关SDL的知识,以便将pygame用于音频,而这超出了通常的游戏风格需求。 Audio with SDL是一个不错的概述,尽管看起来有些过时了。

首先要考虑的是您使用的是哪种音频驱动程序。例如,在许多Linux系统上,ALSA都无法发出低延迟声音,这意味着您编写的最终与ALSA交谈的任何内容也无法做到这一点。而且,如果您的系统设置为使用esd或其他可能的声音守护程序,并且在必要时退回,则显然您不想在这里使用它。因此,如果您遇到类似问题,则必须配置SDL_mixer以使用其他驱动程序。

假设驱动程序可以处理它,那么绝对可以使用pygame.mixer / SDL_mixer发出低延迟的声音。但它可能开箱即用。

您要做的第一件事是选择比默认大小小的缓冲区大小。

另请注意,如果SDL_mixer的采样率/采样率不同,则pygame.mixer会自动在您的背后重新编码。作为目标,这不仅会增加CPU工作的延迟,还意味着真正的缓冲区大小与您认为正在使用的缓冲区大小无关……

替代方法是遍历SDL_mixer / pygame.sound,自己进行混合,然后直接转到SDL_sound / SDL_mixer。仍然会有相同的驱动程序问题,但是由pygame.mixer引起的任何事情(例如重新编码)都将消失。

如果您无法让pygame / SDL做您想做的事情(例如,因为它仅支持系统上的所有驱动程序),那么您将不得不使用其他库。 Wiki上的PythonInMusic具有数百个链接,您也可以搜索PyPI。但是,您可能要从另一端开始-找到要使用的C音频库,然后为其搜索Python绑定(bind)。例如,pyAudio是PortAudio的一个相对较薄的包装器,因此,如果PortAudio的可移植性,可配置性和性能要求满足您的需求并且其API符合您的设计,那么它就会动摇。

可能出错的另一个地方是您的代码。

显然,这不是您的问题,因为您要做的只是为pygame.sound提供预制声音。但是,如果您决定需要将声音和提要缓冲区预先转换为ojit_code,则可能会遇到Python循环慢,算术慢的问题。

我所说的“慢”是指微秒级。每20ms缓冲区循环一次不是问题。每个样本可能循环一次。如果您正在执行任何处理,则应考虑使用NumPy或专用音频库来完成繁琐的工作,而不是使用纯Python。

关于python - 使用Python的音频低延迟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20503978/

10-12 07:40
查看更多