首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python的音频低延迟

使用Python的音频低延迟
EN

Stack Overflow用户
提问于 2013-12-10 19:55:29
回答 1查看 3.2K关注 0票数 0

在使用pygame音频播放时,我注意到延迟时间很长(>100 ms):

代码语言:javascript
复制
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是否有可能降低附加延迟,如果可能,为此目的首选哪些模块。

EN

回答 1

Stack Overflow用户

发布于 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。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20503978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档