Debian/Linux系统下同时录制音频输入输出且避免麦克风回输的命令行方案咨询
Debian/Linux系统下同时录制音频输入输出且避免麦克风回输的命令行方案咨询
嘿,这个需求我之前帮朋友解决过,Linux下用PulseAudio的命令行工具就能搞定,完全不需要图形界面,还能快速切换状态,分轨录制和恢复都很方便,给你一步步说:
核心思路
Linux桌面环境基本都用PulseAudio,我们可以直接利用它的设备监控和独立捕获能力,既实现麦克风输入、系统输出的分轨录制,又能确保麦克风声音不会回传到扬声器——毕竟默认情况下,麦克风的音频只会被捕获,不会主动路由到播放设备,天然避免回输。
第一步:确认你的音频设备
先得搞清楚系统里的输出监控源(对应系统声音)和麦克风输入源,打开终端跑这两个命令:
- 查看系统输出的监控源(用来录系统声音):
你会得到类似pactl list sources short | grep monitoralsa_output.pci-0000_00_1b.0.analog-stereo.monitor这样的字符串,记下来,后面叫它SYSTEM_MONITOR_SOURCE - 查看麦克风输入源:
得到类似pactl list sources short | grep inputalsa_input.pci-0000_00_1b.0.analog-stereo的字符串,记为MIC_SOURCE
第二步:分轨录制音频
我们可以用parec(PulseAudio的录制工具)配合ffmpeg或者sox来生成标准的WAV文件,两个录制任务可以后台并行运行:
- 录制系统输出到单独文件:
ffmpeg -f pulse -i SYSTEM_MONITOR_SOURCE system_output.wav & - 同时录制麦克风输入到另一个文件:
(如果没装ffmpeg,用sox也可以:ffmpeg -f pulse -i MIC_SOURCE mic_input.wav &parec -d SYSTEM_MONITOR_SOURCE | sox -t raw -r 44100 -s -L -b 16 -c 2 - system_output.wav &,麦克风同理)
这时候你正常用电脑就行,系统声音和麦克风都会被分别录到两个文件里,而且你完全听不到麦克风的回声——因为我们没把麦克风的音频路由到扬声器。
第三步:停止录制并快速恢复
录制完成后,只要终止后台的录制进程就行:
- 如果你是用
&把进程放后台的,可以用kill %1 %2(%1是第一个后台任务,%2是第二个,对应上面两个录制命令) - 也可以直接杀相关进程,比如:
(如果用的是sox+parec,就跑pkill ffmpegpkill parec)
因为我们没修改任何系统默认的音频路由设置,终止进程后,音频系统就自动回到正常状态了,完全不需要额外的恢复步骤。
进阶:用虚拟设备实现更灵活的控制
如果你需要更复杂的路由(比如要监听部分音频但不回输),还可以创建一个虚拟sink来中转:
- 加载虚拟sink:
pactl load-module module-null-sink sink_name=VirtualRecSink sink_properties=device.description="Virtual_Recording_Sink" - 把系统输出转发到虚拟sink(不影响你正常听声音):
pactl load-module module-loopback source=SYSTEM_MONITOR_SOURCE sink=VirtualRecSink - 把麦克风转发到虚拟sink(但不会到你的扬声器):
pactl load-module module-loopback source=MIC_SOURCE sink=VirtualRecSink - 录制虚拟sink的监控源(这样可以录混合后的音频,或者你还是可以分开录原来的两个源):
ffmpeg -f pulse -i VirtualRecSink.monitor combined_audio.wav & - 恢复正常状态时,卸载加载的模块就行:
pactl unload-module module-null-sink pactl unload-module module-loopback
这个方案完全是命令行驱动,比Windows的Voicemeeter更轻量,而且完全符合你的需求。
备注:内容来源于stack exchange,提问作者primuspaul
相关产品推荐
相关产品推荐

