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

时间:2019-02-12 23:14:47

标签: alsa

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

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

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

我的设置参数如下

  • 访问权限:SND_PCM_ACCESS_RW_INTERLEAVED
  • 格式:SND_PCM_FORMAT_S16_LE
  • 费率:8000
  • 渠道:1
  • 期间大小:160

我希望周期为2,缓冲区为320(period_size * periods)。但是,如果我尝试使用以下方法之一设置

  • snd_pcm_hw_params_set_periods
  • snd_pcm_hw_params_set_buffer_size

然后我得到-22,即-EINVAL

1 个答案:

答案 0 :(得分:1)

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

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

如果您想读取160个样本,只需告诉snd_pcm_read*()读取160帧。但是,如果这与周期大小不匹配,则会产生抖动。如果降低抖动很重要,则必须将样本放在自己的队列中,然后将其与 用合适的计时器。

请注意,捕获延迟仅取决于周期大小,而不取决于缓冲区大小,因此,应将缓冲区设置得尽可能大,以减少发生超限的风险。