Bas*_*asj 0 python audio latency asio low-latency
使用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)
Run Code Online (Sandbox Code Playgroud)
是pygame延迟的原因是什么?更一般地说,使用Python可以实现低延迟音频播放吗?
应用示例:当MIDI信息从MIDI键盘到达时播放一些.wav文件.(我想编写一个非常非常基本的音乐采样器).当然,延迟将在很大程度上取决于音频接口(ASIO或ASIO等),但我现在想分析Python是否可以实现低附加延迟,如果是这样,那么哪个模块更适合此目的.
pygame是延迟的原因吗?
可能不是.
Pygame只是SDL的包装.在某些领域 - 就像这一个 - 它是一个非常薄的包装.
但SDL - 或者更确切地说 - SDL_mixer可能很容易成为问题.
因此,您可能需要了解SDL,以便将pygame音频用于超出通常游戏风格需求的音频.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有数百个链接,你也可以搜索PyPI.但是,您可能希望从另一端开始 - 找到要使用的C音频库,然后为其搜索Python绑定.例如,pyAudio是PortAudio的一个相对较薄的包装器,所以如果PortAudio的可移植性,可配置性和性能要求满足您的需求并且其API适合您的设计,那么它会变得很糟糕,但它却很糟糕.
事情可能出错的另一个地方是你的代码.
在你的情况下,这显然不是问题,因为你所做的只是给出pygame.mixer预先制作的声音.但是,如果您决定将声音和提要缓冲区预先转换为pygame.sound,则可能会遇到Python循环缓慢且算术速度慢的问题.
"慢"是指微秒级.每20ms缓冲一次循环不是问题.每个样本循环一次可能是.如果您正在进行任何处理,您应该考虑使用NumPy或专用音频库来执行繁琐的工作而不是纯Python.
| 归档时间: |
|
| 查看次数: |
2137 次 |
| 最近记录: |