gpt4 book ai didi

python - 使用 Python 实现音频低延迟

转载 作者:行者123 更新时间:2023-12-03 00:04:48 25 4
gpt4 key购买 nike

关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

8年前关闭。




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

最佳答案

Is pygame the cause of the latency ?



可能不是。

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

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

因此,您可能需要了解一些有关 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 做你想做的事(例如,因为它在你的系统上支持的唯一驱动程序都很糟糕),你将不得不使用不同的库。 PythonInMusic wiki上有数百个链接,你也可以搜索PyPI。但是,您可能想从另一边开始——找到一个您想要使用的 C 音频库,然后搜索它的 Python 绑定(bind)。例如,pyAudio 是 PortAudio 的一个相对较薄的包装器,因此如果 PortAudio 的可移植性、可配置性和性能要求满足您的需求并且它的 API 适合您的设计,它就会很糟糕,否则它就很糟糕。

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

这显然不是你的问题,因为你所做的只是给 pygame.mixer预制的声音。但是,如果您决定需要将声音和馈送缓冲区预转换为 pygame.sound ,你可能会遇到 Python 循环慢、算术慢的问题。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com