【问题标题】:Audio low latency with Python [closed]Python的音频低延迟[关闭]
【发布时间】:2013-12-10 19:55:29
【问题描述】:

当使用pygame 音频播放时,我注意到高延迟(>100 毫秒):

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 是否可以实现低附加延迟,如果可以,哪些模块更适合此目的。

【问题讨论】:

  • 是的,这是可能的。但是 StackOverflow 并不是一个很好的资源来寻求工具和库的建议。有关详细信息,请参阅帮助/常见问题解答。
  • 同时,Python wiki 上的PythonInMusic 上有一个页面。不知道它有多最新或多全面,但肯定有指向以不同方式绑定各种不同原生音频库的现场项目的链接,这应该可以帮助您入门并展示可以做什么。
  • 是的@abarnert,我完全修改了我的问题,以便就与某些实现相关的精确问题提出一个精确的问题(带有可重复的示例)。我希望避免“关闭”,尤其是当我在这里看到类似的主题时:stackoverflow.com/questions/1448630/…

标签: python audio latency asio low-latency


【解决方案1】:

pygame 是导致延迟的原因吗?

可能不会。

Pygame 只是 SDL 的封装。在某些领域——比如这个——它是一个非常薄的包装。

但 SDL(或者更确切地说,SDL_mixer)很容易成为问题。

因此,您可能需要了解一些有关 SDL 的知识,才能使用 pygame 获得超出通常游戏风格需求的音频。 Audio with SDL 是一个很好的概述,虽然它似乎有点过时了。


首先要考虑的是您使用的音频驱动程序。例如,在许多 linux 系统上,ALSA 不能做低延迟的声音,这意味着你写的任何最终与 ALSA 对话的东西也不能做。如果您的系统设置为使用esd 或其他声音守护程序(如果可能)并在必要时回退,那么您显然不希望在此处使用。因此,如果您遇到类似的问题,您必须配置 SDL_mixer 以使用不同的驱动程序。


假设驱动程序可以处理它,肯定可以用pygame.mixer/SDL_mixer 做低延迟的声音。但它可能无法开箱即用。

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

另请注意,SDL_mixer 会自动在您背后重新编码您的声音,如果它们不在相同的采样率/等等。作为目标,这不仅为 CPU 工作增加了一点延迟,还意味着 real 缓冲区大小与您认为正在使用的缓冲区大小无关……

另一种方法是绕过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 毫秒缓冲区循环一次不是问题。每个样本可能循环一次。如果您要进行任何处理,则应考虑使用 NumPy 或专用音频库来完成繁重的工作,而不是纯 Python。

【讨论】:

    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多