我希望在我正在编写的程序中以低延迟在Linux上捕获音频。
我使用ALSA API运行了一些实验,使用snd_pcm_readi()来 捕获声音,然后立即使用snd_pcm_writei()播放它。
我尝试过捕获的帧数和缓冲区大小, 但我似乎无法将延迟降低到不到一秒钟 左右。
我最好使用PulseAudio或JACK吗?那些可以用来玩 捕获音频?
答案 0 :(得分:1)
要减少捕获延迟,请缩短捕获设备的周期大小。 要减少播放延迟,请减小播放设备的缓冲区大小。
Jack可以播放捕获的音频(只需将输入端口连接到输出端口),但您仍需要配置其周期/缓冲区。
另见Relation between period size of speaker and mic和Recording 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中的音频延迟。可以在那里找到一些起始参考点: