如何在 ALSA 中设置周期和缓冲区大小?
How to set periods and buffer size in ALSA?
我正在尝试为 sip 之类的应用程序捕获音频。
我想在 8khz 单声道时获得 20 毫秒的音频。
我需要应用程序准确地每 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 帧即可。但是,如果这与周期大小不匹配,则会出现抖动。如果减少抖动很重要,则必须将样本放入自己的队列中并与
使用适当的计时器。
请注意,捕获延迟仅取决于周期大小,而不取决于缓冲区大小,因此您应使缓冲区尽可能大以降低溢出风险。
我正在尝试为 sip 之类的应用程序捕获音频。
我想在 8khz 单声道时获得 20 毫秒的音频。
我需要应用程序准确地每 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 帧即可。但是,如果这与周期大小不匹配,则会出现抖动。如果减少抖动很重要,则必须将样本放入自己的队列中并与
使用适当的计时器。
请注意,捕获延迟仅取决于周期大小,而不取决于缓冲区大小,因此您应使缓冲区尽可能大以降低溢出风险。