在Linux上以低延迟捕获声音

时间:2014-09-03 15:12:17

标签: audio alsa pulseaudio jack

我希望在我正在编写的程序中以低延迟在Linux上捕获音频。

我使用ALSA API运行了一些实验,使用snd_pcm_readi()来 捕获声音,然后立即使用snd_pcm_writei()播放它。

我尝试过捕获的帧数和缓冲区大小, 但我似乎无法将延迟降低到不到一秒钟 左右。

我最好使用PulseAudio或JACK吗?那些可以用来玩 捕获音频?

3 个答案:

答案 0 :(得分:1)

要减少捕获延迟,请缩短捕获设备的周期大小。 要减少播放延迟,请减小播放设备的缓冲区大小。

Jack可以播放捕获的音频(只需将输入端口连接到输出端口),但您仍需要配置其周期/缓冲区。

另见Relation between period size of speaker and micRecording from ALSA - understanding memory mapping

答案 1 :(得分:1)

我在低延迟音频编程方面做了一些工作,

我的经验是,首先,你的捕获缓冲区应该很小,比如10ms周期缓冲区。 (假设您使用的是512帧缓冲区,48000采样率)。

然后,您应该将输出设备start_threshold配置为至少2 *帧大小(如果没有太多记录数据,则为1 *帧大小)。

对于记录设备,如CL。说,使用相对较小的周期尺寸更好,但不能太小,以避免过多的irq。

此外,您可以将流程计划更改为FIFO计划。

然后,希望您将获得大约20毫秒的总延迟。

答案 2 :(得分:1)

我相信您应该首先确保运行的Linux内核实际上允许您实现低典型延迟。

您可以查看几种内核编译时配置选项:

  • CONFIG_HZ_1000
  • CONFIG_IRQ_FORCED_THREADING
  • CONFIG_PREEMPT
  • CONFIG_PREEMPT_RT_FULL(仅适用于RT补丁)

除此之外,您还可以采取更多措施来优化Linux中的音频延迟。可以在那里找到一些起始参考点:

http://wiki.linuxaudio.org/wiki/real_time_info