Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Portaudio 回叫之间的时间?_Portaudio_Pyaudio - Fatal编程技术网

Portaudio 回叫之间的时间?

Portaudio 回叫之间的时间?,portaudio,pyaudio,Portaudio,Pyaudio,我有一个主要使用PyAudio的实验室项目,为了进一步了解它的工作方式,我做了一些测量,在本例中是回调之间的时间(使用回调模式) 我计时,得到了一个有趣的结果 (@256块大小,44.1k fs):0.0099701;0.0000365;0.0000201;0.0201579 这种模式持续不断 在两个较长的调用之间,我们有两个较短的调用,有时较长的调用较短(请注意,我在程序中只做回调时间) 如果我们将其平均,我们将得到所需的回调时间: 1/44100*256(约5.8毫秒) 以下是我的可视化测量

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

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

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

这种模式持续不断

在两个较长的调用之间,我们有两个较短的调用,有时较长的调用较短(请注意,我在程序中只做回调时间)

如果我们将其平均,我们将得到所需的回调时间:

1/44100*256(约5.8毫秒)

以下是我的可视化测量:


有人能解释一下引擎盖下面到底发生了什么吗?

在PortAudio引擎盖下面发生了什么取决于许多因素,包括:

  • 哪个本机音频API PortAudio正在与之对话
  • 您传递给
    Pa\u OpenStream()的缓冲区大小和延迟参数是什么
  • 音频硬件及其驱动程序的功能,包括其支持的缓冲区大小、缓冲模式和定时特性
在某些情况下,PortAudio将从本机音频API请求更大的缓冲区,然后快速连续多次调用PortAudio用户回调。如果您选择了较小的回调缓冲区大小和较长的延迟,则可能会发生这种情况

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

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

以上并非唯一的可能性

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

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

您可以尝试将请求的流延迟减少到0,并查看这是否会改变结果。这将强制双缓冲,这可能产生也可能不产生稳定的输出。另一种尝试是使用
paFramesPerBufferUnspecified
参数,这将导致使用本机缓冲区大小调用回调——然后可以观察是否存在更大的周期性,缓冲区大小是什么,以及缓冲区大小是否随回调而变化

您没有说明要针对哪个操作系统和主机API,因此很难给出比上面更具体的细节


回答一个相关的问题:为什么会这样?除了作为本机音频子系统较低层的功能或缓冲区自适应过程的情况外,这通常是由于为
Pa\u OpenStream()
指定了较大的建议延迟。如果指定的延迟非常高,一些PortAudio主机API将放宽缓冲区周期,以减少由高频计时器回调引起的系统负载

谢谢你的详细回答!其中包括我们与我的顾问一起思考的一些想法:)我使用的是win8,使用的是该系列提供的版本,具有相当基本的设置。我将再次尝试建议的选项,谢谢!请原谅我用我的noobish问题打扰您,但是在PyAudio中,如何设置延迟或使用paFramesPerBufferUnspecified参数?我用的是PyAudioexclusively@function_store我不确定,我从来没用过PyAudio。若要获取未指定的PaFramesPerBuffer,请尝试为framesPerBuffer传递0。