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



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

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

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

我设置了如下参数

  • 访问:SND_PCM_ACCESS_RW_INTERLEAVED
  • 格式: SND_PCM_FORMAT_S16_LE
  • 速度: 8000
  • 通道: 1
  • 周期大小: 160

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

  • snd_pcm_hw_params_set_periods
  • snd_pcm_hw_params_set_buffer_size

然后我得到 -22 返回,即 -EINVAL

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

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

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

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

最新更新