ALSA中Dsnoop绑定FIFO作为Slave报错问题求助
问题解决:ALSA中用Tee替代Dsnoop实现FIFO音频流分流
核心原因
dsnoop插件是专门为硬件PCM设备设计的多路捕获工具,它依赖硬件提供的IPC同步机制实现多进程共享捕获流。而fifo类型的PCM属于软件模拟设备,不具备这类硬件IPC支持,因此无法作为dsnoop的slave使用,这就是你遇到Invalid type 'fifo' for slave PCM错误的根本原因。
可行替代方案:使用Tee插件分流
ALSA的tee插件可以将单个输入音频流复制到多个输出流,完美适配你的分流需求,且支持软件PCM(如FIFO)作为输入。以下是修改后的完整asound.conf配置:
pcm.!default { type asym playback.pcm "playback" capture.pcm "capture" } pcm.playback { type plug slave.pcm "eci" } # 默认捕获设备:压缩器处理后的流 pcm.capture { type plug slave.pcm "compressor" } # 备用捕获设备:降噪处理后的流 pcm.capture2 { type plug slave.pcm "werman" } # 降噪插件:输入来自tee的分流流 pcm.werman { type ladspa slave.pcm "tee_stream1"; path "/usr/lib/ladspa"; plugins [{ label noise_suppressor_mono input { controls [ 1 ] # VAD阈值百分比 } }] } # 压缩器插件:输入来自tee的分流流 pcm.compressor { type ladspa slave.pcm "tee_stream0"; path "/usr/lib/ladspa"; plugins [{ label dysonCompress input { controls [0 1 0.5 0.99] # peak limit, release time, fast ratio, ratio } }] } # Tee分流核心:将eco的FIFO流复制到两个输出流 pcm.tee_ec { type tee slave.pcm "eco" streams.0 { pcm "tee_stream0" capture_only true } streams.1 { pcm "tee_stream1" capture_only true } } # 定义两个tee的输出流(仅作为中转) pcm.tee_stream0 { type plug slave { format S16_LE rate 32000 channels 1 } } pcm.tee_stream1 { type plug slave { format S16_LE rate 32000 channels 1 } } # 播放端:将音频写入EC软件的输入FIFO pcm.eci { type plug slave { format S16_LE rate 32000 channels 1 pcm { type file slave.pcm null file "/tmp/ec.input" format "raw" } } } # 捕获端:读取EC软件输出的FIFO流 pcm.eco { type plug slave.pcm { type fifo infile "/tmp/ec.output" rate 32000 format S16_LE channels 1 } }
配置说明
tee_ec:作为分流核心,将eco读取的FIFO流复制到tee_stream0和tee_stream1两个独立流中。tee_stream0/tee_stream1:作为中转流,确保格式、采样率与EC输出一致,避免插件处理时出现格式不兼容问题。- 降噪/压缩器插件:分别从对应的tee分流流获取输入,保持原有参数配置不变。
测试步骤
- 先启动回声消除软件,确保
/tmp/ec.input和/tmp/ec.output两个FIFO文件已创建;若未创建,可手动执行mkfifo /tmp/ec.input /tmp/ec.output。 - 测试默认捕获设备(压缩器处理后):
sudo arecord -D default -f cd defRecording.wav -c 1 -r 32000 - 测试降噪处理后的设备:
sudo arecord -D capture2 -f cd noiseReduced.wav -c 1 -r 32000
额外注意事项
- 确保EC软件的输出格式(S16_LE、32000Hz、单声道)与ALSA配置完全匹配,否则会出现格式转换错误。
内容的提问来源于stack exchange,提问作者CNCoder
相关产品推荐
相关产品推荐

