如何在 ALSA 中设置周期和缓冲区大小?

How to set periods and buffer size in ALSA?

我正在尝试为 sip 之类的应用程序捕获音频。

我想在 8khz 单声道时获得 20 毫秒的音频。

我需要应用程序准确地每 20 毫秒获取一次音频以避免抖动。

我设置的参数如下

我希望周期为 2,缓冲区为 320(period_size*周期)。但是,如果我尝试使用以下方式设置其中任何一个:

然后我返回-22,也就是-EINVAL

周期大小指定硬件通知您的应用程序已捕获完整周期的频率。它是一个硬件参数,这意味着硬件可能不支持您想要的值。

要获得最接近所需值的周期大小,请使用 snd_pcm_hw_params_set_period_size_near()

如果要读取 160 个样本,只需告诉 snd_pcm_read*() 读取 160 帧即可。但是,如果这与周期大小不匹配,则会出现抖动。如果减少抖动很重要,则必须将样本放入自己的队列中并与 使用适当的计时器。

请注意,捕获延迟仅取决于周期大小,而不取决于缓冲区大小,因此您应使缓冲区尽可能大以降低溢出风险。