【问题标题】:ALSA capture causes high CPU usageALSA 捕获导致高 CPU 使用率
【发布时间】:2023-04-09 09:10:01
【问题描述】:

我编写了一个全双工 ALSA 程序并在基于 linux 的嵌入式系统上运行它。 它的声音配置是:

  • 采样率:16Hz
  • 频道:1(单声道)
  • 格式:S16_LE
  • 分钟可用:160(帧)

对于实时应用,我需要每 10 毫秒捕获一次声音,因此我将最小可用性设置为 160。

我的问题是:当程序运行时,CPU 使用率非常高,可能是 99.9%(通过 top 命令)。有时 CPU 负载很低,但一旦达到 99.9%,就无法回到低 CPU 使用率。

我发现这可能是配置问题。在 asound.conf 文件中(参见后面的代码),我创建了一个名为“asym0”的 asym 类型卡,用于选择两个不同的从卡进行播放和捕获。

最初,我使用“主要”作为捕获设备,但它会导致 CPU 使用率很高。然后我创建了一个名为“rate0”的费率类型卡,并将其设置为捕获设备。 CPU 使用率变低,在 20%~60% 之间浮动,但捕获的声音听起来很糟糕。如果我测试麦克风(捕获),我的声音中会听到一些“po po po”。

所以...

  • 如果我选择“primary”,CPU使用率很高,但没有“po po po”的声音。
  • 如果我选择“rate0”,CPU使用率较低,但有“po po po”的声音。

与“type hw”和“type rate”有什么不同?
是中断频率不同造成的影响吗?

asound.conf 文件:

pcm.primary { type hw card mycard } pcm.rate0 { type rate slave { pcm "primary" rate 16000 } } pcm.asym0 { type asym playback.pcm "primary" capture.pcm "primary" or "rate0" }

请任何人帮助我解决这个问题。谢谢!!!

【问题讨论】:

  • 您的硬件实际支持哪些格式/通道/速率?
  • 它支持 16/24 位线性、单声道左/右或立体声通道以及 16kHz 和 48kHz 的采样宽度。
  • 请同时显示arecord -v -fdat -c1 -D primary something.wav 和arecord -v -fdat -c1 -D rate0 something.wav 的输出。

标签: c linux audio alsa libasound


【解决方案1】:

声音捕捉对于 CPU 来说应该是一项非常微不足道的任务,因为大部分任务都发生在硅硬件中,并且偶尔需要启动线程来处理输入音频。通常,如果您的周期或缓冲区非常小,则需要更多的 CPU 关注,并且可能会出现溢出。溢出可能是您的信号丢失发生的地方。

如果您的采样率为 16 kHz,并且您每 10 毫秒捕获一次,那确实是 160 帧。

需要查看的内容是您的周期是否小于 10 毫秒,您是否正在执行线程中非常繁重的处理。

为了帮助您,gtkIOStream 中有一些代码实现了 C++ OO ALSA 层次结构。您可以查看这个ALSAFullduplex.C 测试应用程序作为参考,并对其进行测试,看看它是否遇到与您相同的问题。

此电子邮件中提供了有关构建 gtkIOStream 的信息: https://lists.audioinjector.net/pipermail/people/2020-March/000028.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    相关资源
    最近更新 更多