You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在树莓派的Node.js应用(或sox)中捕获系统总线音频?

问题诊断

你当前的问题核心在于:sox通过ALSA的default设备捕获音频,但该设备并未关联到PulseAudio的回环流。尽管你加载了PulseAudio回环模块并能在pavucontrol看到捕获,但ALSA和PulseAudio是两套独立的音频系统,默认情况下ALSA的default可能指向硬件ADC(Hifiberry的输入),而非PulseAudio的回环监控源,导致录不到系统声音。

解决方案

方案1:让sox直接使用PulseAudio设备(推荐)

跳过ALSA,直接让sox从PulseAudio的回环/监控源捕获音频:

  1. 先通过命令列出所有PulseAudio音频源:
pactl list sources short

找到类似alsa_output.*.monitor的设备(这是PulseAudio的输出监控源,对应回环捕获的系统声音),或者你加载的回环模块对应的源。

  1. 修改Node.js中的sox参数,将ALSA设备替换为PulseAudio设备:
const soxCommand = 'sox'
// 替换<your-pulse-source>为第一步找到的源名称,比如alsa_output.platform-soc_sound.stereo-fallback.monitor
const args = ['-t', 'pulse', '<your-pulse-source>', '-t', 'mp3', '-C', '128', 'output.mp3']
const audioRecorder = spawn(soxCommand, args)

方案2:配置ALSA默认设备指向PulseAudio

修改ALSA配置,让default设备自动路由到PulseAudio,这样你原来的sox命令无需修改:

  1. 创建或编辑用户级配置文件~/.asoundrc,添加以下内容:
pcm.!default {
    type pulse
}
ctl.!default {
    type pulse
}

如果需要系统级生效,编辑/etc/asound.conf即可。

  1. 重启你的Node.js应用,重新运行录制命令。

方案3:直接指定Hifiberry ADC硬件设备(仅录硬件输入)

如果你仅需要捕获硬件输入(而非系统回环声音),可直接指定ALSA硬件设备:

  1. 列出ALSA硬件设备:
aplay -l

找到Hifiberry ADC对应的设备,比如hw:1,0。

  1. 修改sox参数:
const soxCommand = 'sox'
const args = ['-t', 'alsa', 'hw:1,0', '-t', 'mp3', '-C', '128', 'output.mp3']
const audioRecorder = spawn(soxCommand, args)
验证步骤

先在命令行测试sox命令是否能正常录制:

sox -t pulse <your-pulse-source> test.mp3

播放声音后停止录制,检查test.mp3是否有音频数据。如果命令行可行,再移植到Node.js代码中,排除代码本身的问题。

内容的提问来源于stack exchange,提问作者Sam Rappl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:47:18