Portaudio 回叫之间的时间?
我有一个主要使用PyAudio的实验室项目,为了进一步了解它的工作方式,我做了一些测量,在本例中是回调之间的时间(使用回调模式) 我计时,得到了一个有趣的结果 (@256块大小,44.1k fs):0.0099701;0.0000365;0.0000201;0.0201579 这种模式持续不断 在两个较长的调用之间,我们有两个较短的调用,有时较长的调用较短(请注意,我在程序中只做回调时间) 如果我们将其平均,我们将得到所需的回调时间: 1/44100*256(约5.8毫秒) 以下是我的可视化测量:Portaudio 回叫之间的时间?,portaudio,pyaudio,Portaudio,Pyaudio,我有一个主要使用PyAudio的实验室项目,为了进一步了解它的工作方式,我做了一些测量,在本例中是回调之间的时间(使用回调模式) 我计时,得到了一个有趣的结果 (@256块大小,44.1k fs):0.0099701;0.0000365;0.0000201;0.0201579 这种模式持续不断 在两个较长的调用之间,我们有两个较短的调用,有时较长的调用较短(请注意,我在程序中只做回调时间) 如果我们将其平均,我们将得到所需的回调时间: 1/44100*256(约5.8毫秒) 以下是我的可视化测量
有人能解释一下引擎盖下面到底发生了什么吗?在PortAudio引擎盖下面发生了什么取决于许多因素,包括:
- 哪个本机音频API PortAudio正在与之对话
- 您传递给
Pa\u OpenStream()的缓冲区大小和延迟参数是什么
- 音频硬件及其驱动程序的功能,包括其支持的缓冲区大小、缓冲模式和定时特性
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。