【问题标题】:Capturing sound on Linux with low latency在 Linux 上以低延迟捕获声音
【发布时间】:2014-10-28 03:59:04
【问题描述】:

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

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

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

我是使用 PulseAudio 还是 JACK 更好?那些可以用来玩 捕获的音频?

【问题讨论】:

  • 另外,ALSA snd_pcm_mmap... 函数会改善延迟吗?

标签: audio alsa pulseaudio jack


【解决方案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

【讨论】:

    【解决方案2】:

    我正在做一些低延迟音频编程的工作,

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多