PyAudio - Windows 10 上的延迟变化

问题描述 投票:0回答:2

我正在使用 PyAudio 并使用 PyAudio 网站上的示例:

import time
import pyaudio

WIDTH = 2
CHANNELS = 1
RATE = 16000

p = pyaudio.PyAudio()

def callback(in_data, frame_count, time_info, status):
    return (in_data, pyaudio.paContinue)

stream = p.open(format=p.get_format_from_width(WIDTH),
                channels=CHANNELS,
                rate=RATE,
                input=True,
                output=True,
                frames_per_buffer=512,
                stream_callback=callback
               )

stream.start_stream()

while stream.is_active():
    time.sleep(5)

stream.stop_stream()
stream.close()

p.terminate()

我计算了延迟(每秒):

有谁知道这些山峰从哪里来?

python audio pyaudio portaudio
2个回答
1
投票

Windows、Linux 或 Mac 等主要操作系统都是非实时的。这意味着操作系统可以优先考虑其他应用程序的 CPU 时间而不是音频采样程序。这会让您的程序等待 CPU 选择其程序,从声卡获取样本。

我考虑过三种方法来解决这个问题。

  • 禁用不必要的服务
  • 使用声卡缓冲
  • 切换到实时操作系统(Linux 上的 ALSA 已经差不多了)

系统中最大的瓶颈之一是您的云端硬盘活动。这通常是由 Windows 更新、病毒扫描程序/实时防护、Windows 遥测和 Windows 索引服务 (Superfetch) 引起的。将您的 Internet 连接设置为按流量计费,这样 Windows Update 就不会自动更新。确保在防病毒/反恶意软件程序上禁用实时扫描,并在设置中禁用 Windows Defender。 Windows 有一个名为 Windows Telemetry 的“Corprate-Ware”服务,它与 Microsoft 共享您的使用信息,您可以继续在服务中禁用它。现在您并不是真的想禁用 Windows 索引服务,但如果您的计算机比典型的 5200rpm HDD 慢,我建议您在完全相同的服务窗口中禁用它。

有些声卡中有硬件缓冲区,有些则没有,这取决于情况。如果您知道您的系统有硬件缓冲区,它将大大减少所经历的丢失样本的数量。如果您要使用声卡硬件缓冲区,您将必须自己研究它。

最后,只需切换到延迟较低的操作系统,例如Linux。它不像 Windows 那样在后台计算那么多垃圾。尝试使用 python 的 Lubuntu 和 ALSA 音频驱动程序。它应该超出您的需要。


0
投票

根据以下文档,PyAudio 提供了 PortAudio 的绑定并支持多个操作系统。但是,在 Windows 上,它仅支持 Windows MME API、DirectSound、WASAPI 和 WDM-KS。它不包括对 ASIO 的支持。

https://pypi.org/project/PyAudio/

如果您想要支持低延迟的 ASIO 支持,您需要在启用 ASIO 的情况下编译 PortAudio。具体操作方法如下:https://www.portaudio.com/docs/v19-doxydocs/compile_windows_asio_msvc.html

© www.soinside.com 2019 - 2024. All rights reserved.