【问题标题】:PyAudio - Latency variations on Windows 10PyAudio - Windows 10 上的延迟变化
【发布时间】:2017-07-25 02:21:42
【问题描述】:

我正在使用 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()

我计算了延迟(每秒):

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

【问题讨论】:

  • 请参阅stackoverflow.com/q/42568942 以获得可能的解释。出于好奇:您能否添加一些有关您如何计算这些延迟的信息?
  • 我读了它,但不明白这对我有什么帮助:(我用另一台计算机听到两次声音计算了这些延迟(在现场和运行这个 python 程序的计算机的扬声器中) . 然后我寻找不同之处:) 如果你知道一种更好的方法,我会很高兴:)
  • 好的,抱歉,这似乎是另一种情况。我仍然不清楚你是如何得到你的价值观的。 y轴上使用什么单位? x轴是以秒为单位的吗?即使您仅激活流 5 秒,这如何工作?
  • Y 以毫秒为单位(x 轴只是不同的计算)。流没有给定的持续时间(这是一个无限循环)。谢谢大家,我终于可以让 ASIO 工作了,所以这不再是问题了

标签: python audio pyaudio portaudio


【解决方案1】:

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

我考虑过解决此问题的三种方法。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多