4

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

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

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

我最好使用 PulseAudio 还是 JACK?那些可以用来播放捕获的音频吗?

4

3 回答 3

1

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

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

另请参阅扬声器和麦克风的周期大小之间的关系来自 ALSA 的记录 - 理解内存映射

于 2014-09-03T17:08:31.923 回答
1

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

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

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

用于记录设备,如 CL。说,使用一个比较小的period size比较好,但是不要太小,以免irq太多。

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

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

于 2015-05-19T08:00:58.673 回答
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

于 2015-11-29T23:26:37.300 回答