如何在树莓派的Node.js应用(或sox)中捕获系统总线音频?
问题诊断
你当前的问题核心在于:sox通过ALSA的default设备捕获音频,但该设备并未关联到PulseAudio的回环流。尽管你加载了PulseAudio回环模块并能在pavucontrol看到捕获,但ALSA和PulseAudio是两套独立的音频系统,默认情况下ALSA的default可能指向硬件ADC(Hifiberry的输入),而非PulseAudio的回环监控源,导致录不到系统声音。
解决方案
方案1:让sox直接使用PulseAudio设备(推荐)
跳过ALSA,直接让sox从PulseAudio的回环/监控源捕获音频:
- 先通过命令列出所有PulseAudio音频源:
pactl list sources short
找到类似alsa_output.*.monitor的设备(这是PulseAudio的输出监控源,对应回环捕获的系统声音),或者你加载的回环模块对应的源。
- 修改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命令无需修改:
- 创建或编辑用户级配置文件
~/.asoundrc,添加以下内容:
pcm.!default { type pulse } ctl.!default { type pulse }
如果需要系统级生效,编辑/etc/asound.conf即可。
- 重启你的Node.js应用,重新运行录制命令。
方案3:直接指定Hifiberry ADC硬件设备(仅录硬件输入)
如果你仅需要捕获硬件输入(而非系统回环声音),可直接指定ALSA硬件设备:
- 列出ALSA硬件设备:
aplay -l
找到Hifiberry ADC对应的设备,比如hw:1,0。
- 修改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
相关产品推荐
相关产品推荐

