我正在尝试为类似sip的应用程序捕获音频。
我想以8khz单声道获得20毫秒的音频。
我需要应用程序每20毫秒准确获取一次音频,以避免抖动。
我的设置参数如下
我希望周期为2,缓冲区为320(period_size * periods)。但是,如果我尝试使用以下方法之一设置
:然后我得到-22,即-EINVAL
答案 0 :(得分:1)
周期大小指定硬件通知您的应用程序已捕获完整周期的频率。这是一个硬件参数,表示该硬件可能不支持所需的值。
要获取最接近所需值的期间大小,请使用snd_pcm_hw_params_set_period_size_near()
。
如果您想读取160个样本,只需告诉snd_pcm_read*()
读取160帧。但是,如果这与周期大小不匹配,则会产生抖动。如果降低抖动很重要,则必须将样本放在自己的队列中,然后将其与
用合适的计时器。
请注意,捕获延迟仅取决于周期大小,而不取决于缓冲区大小,因此,应将缓冲区设置得尽可能大,以减少发生超限的风险。