回叫电话之间的时间?

fun*_*ore 4 portaudio pyaudio

我有一个主要使用PyAudio的实验室项目,为了进一步了解它的工作方式,我进行了一些测量,在这种情况下,回调之间的时间(使用回调模式).

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

(@ 256块大小,44.1k fs):0.0099701; 0.0000365; 0.0000201; 0.0201579

这种模式一直在继续.

在两个较长的呼叫之间,我们有两个较短的呼叫,有时较长的呼叫较短(请注意,我在程序中没有做任何其他事情而不是回调时间).

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

1/44100*256(约5.8ms)

这是我的测量可视化: 在此输入图像描述

那么有人可以解释一下这里究竟发生了什么?

Ros*_*ina 6

在PortAudio的幕后发生的事情取决于许多因素,包括:

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

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

另一种情况是本机音频API不支持您为回调大小(framesPerBuffer参数to Pa_OpenStream())请求的缓冲区大小.在这种情况下,PortAudio将被强制使用驱动程序支持的缓冲区大小,然后在该缓冲区大小和回调缓冲区大小之间"适应".这种适应过程会导致不规则的时间安排.

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

以上不是唯一的可能性.

在你的情况下发生的事情的一个可能的解释是PortAudio快速连续调用你的回调3次(猜测是本机缓冲区大小是你的回调缓冲区大小的3倍),原因之一是.

另一种可能性是本机音频子系统不规则地发信号通知PortAudio.如果PortAudio下面的系统层正在执行与上述相似的缓冲,则会发生这种情况.我已经看到这种情况发生在Windows 7上的DirectSound上.ASIO4ALL驱动程序将显示+/- 1ms抖动(这不是您所看到的).

您可以尝试将请求的流延迟减少到0,并查看是否会更改结果.这将强制双缓冲,这可能会或可能不会产生稳定的输出.另一个尝试是使用paFramesPerBufferUnspecified参数,这将导致使用本机缓冲区大小调用回调 - 然后您可以观察是否有更大的周期性,缓冲区大小是什么,以及缓冲区大小是否与回调不同回调.

您没有说明您正在使用哪种操作系统和主机API,因此很难提供比上述更具体的详细信息.

PortAudio wiki上详细描述了各种PortAudio主机API后端使用的内部缓冲模型.

回答相关问题:为什么会这样?除了它是本机音频子系统的较低层或缓冲器适应过程的功能的情况之外,它通常是指定大的建议等待时间的结果Pa_OpenStream().如果指定的延迟非常高,某些PortAudio主机API将放宽缓冲区周期,以减少由高频定时器回调引起的系统负载.