gpt4 book ai didi

portaudio - 回调调用之间的时间间隔?

转载 作者:行者123 更新时间:2023-12-02 23:15:53 25 4
gpt4 key购买 nike

我有一个主要使用 PyAudio 的实验室项目,为了进一步了解其工作方式,我做了一些测量,在本例中是回调之间的时间(使用回调模式)。

我计时了,得到了一个有趣的结果

(@256 chunk size, 44.1k fs): 0.0099701;0.0000365;0.0000201;0.0201579

这种模式一直持续下去。

在两个较长的调用之间,我们有两个较短的调用,有时较长的调用更短(请注意,除了回调时间之外,我在程序中没有做任何其他事情)。

如果我们对此进行平均,我们就会得到所需的回调时间:

1/44100 * 256 (roughly 5.8ms)

这是我的可视化测量结果:enter image description here

那么有人可以解释一下到底发生了什么吗?

最佳答案

PortAudio 内部发生的情况取决于许多因素,包括:

  • PortAudio 正在与哪个 native 音频 API 进行通信
  • 您传递给 Pa_OpenStream() 的缓冲区大小和延迟参数
  • 音频硬件及其驱动程序的功能,包括其支持的缓冲区大小、缓冲模型和时序特征。

在某些情况下,PortAudio 将从 native 音频 API 请求更大的缓冲区,然后快速连续多次调用 PortAudio 用户回调。如果您选择了较小的回调缓冲区大小和较长的延迟,则可能会发生这种情况。

另一种情况是 native 音频 API 不支持您为回调大小请求的缓冲区大小(Pa_OpenStream()framesPerBuffer 参数)。在这种情况下,PortAudio 将被迫使用驱动程序支持的缓冲区大小,然后在该缓冲区大小和回调缓冲区大小之间进行“调整”。此适应过程可能会导致计时不规则。

另一种可能性是 native 音频 API 使用大型环形缓冲区。每次 PortAudio 轮询 native 主机 API 时,它都会根据需要多次调用回调来填充 native 环形缓冲区。在这种情况下,不规则的计时与轮询率有关。

以上并不是唯一的可能性。

对于您的情况,一种可能的解释是,由于上述原因之一,PortAudio 快速连续调用回调 3 次(猜测 native 缓冲区大小是回调缓冲区大小的 3 倍)。

另一种可能性是 native 音频子系统不规则地向 PortAudio 发送信号。如果 PortAudio 下面的系统层正在执行与我上面描述的类似类型的缓冲,则可能会发生这种情况。例如,我曾在 Windows 7 上的 DirectSound 中看到过这种情况。 ASIO4ALL 驱动程序将出现 +/- 1ms 抖动(这不是您所看到的)。

您可以尝试将请求的流延迟减少到 0,看看结果是否会改变。这将强制双缓冲,这可能会也可能不会产生稳定的输出。另一件可以尝试的事情是使用 paFramesPerBufferUnspecified 参数,这将导致使用 native 缓冲区大小调用回调 - 然后您可以观察是否存在更大的周期性、缓冲区大小是多少,以及以及缓冲区大小是否因回调而异。

您没有说明您的目标操作系统和主机 API,因此很难提供比上述更具体的详细信息。

The internal buffering models used by the various PortAudio host API backends are described in some detail on the PortAudio wiki.

回答一个相关问题:为什么会这样?除了 native 音频子系统的较低层或缓冲区适应过程的函数的情况外,它通常是这是为 Pa_OpenStream() 指定较大建议延迟的结果。如果指定的延迟非常高,一些 PortAudio 主机 API 将放宽缓冲区周期,以减少高频计时器回调造成的系统负载。

关于portaudio - 回调调用之间的时间间隔?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23214614/

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