如何让PulseAudio将程序输出设为独立流并供其他程序作为输入?
嘿,我来帮你搞定这个需求!要让play "|rec -d pitch -310"的输出变成独立的PulseAudio流,方便其他程序捕获作为输入,咱们可以通过创建自定义PulseAudio sink并定向命令输出的方式实现,具体步骤如下:
1. 创建自定义PulseAudio Null Sink
首先得创建一个专门的“空 sink”,这个sink会作为你那串命令输出的独立音频载体。打开终端执行以下命令:
pactl load-module module-null-sink sink_name=my_pitch_shift_sink sink_properties=device.description="Pitch_Shift_Output_Sink"
sink_name是这个sink的内部标识,你可以改成自己喜欢的名字;device.description是在音频控制面板里显示的名称,方便你识别。
2. 将play命令的输出定向到新sink
接下来要让SoX的play命令把音频输出到咱们刚创建的sink里,有两种简单的方式:
方式一:直接在SoX命令里指定输出设备
先确认新sink的PulseAudio设备名,执行pactl list sinks short,找到my_pitch_shift_sink对应的设备名(一般是null-sink.my_pitch_shift_sink或者直接是my_pitch_shift_sink)。然后修改你的命令:
play "|rec -d pitch -310" --output-device=my_pitch_shift_sink
如果SoX没自动识别PulseAudio后端,可以加上--type pulse参数强制指定:
play "|rec -d pitch -310" --type pulse --output-device=my_pitch_shift_sink
方式二:用环境变量临时指定输出sink
这种方式更简洁,不需要查设备名,直接通过PULSE_SINK环境变量告诉PulseAudio把当前命令的输出定向到目标sink:
PULSE_SINK=my_pitch_shift_sink play "|rec -d pitch -310"
3. 让其他程序捕获这个独立流
每个PulseAudio sink都对应一个monitor源,其他程序可以通过选择这个monitor源来获取sink的输出。执行pactl list sources short,你会看到类似my_pitch_shift_sink.monitor的源,在需要输入的程序里选择这个源,就能捕获到play命令产生的音频流了。
额外小贴士
如果你希望这个自定义sink每次开机或重启PulseAudio后自动加载,可以把加载模块的命令添加到PulseAudio的配置文件里:
- 编辑
~/.config/pulse/default.pa(如果没有就创建一个),添加一行:load-module module-null-sink sink_name=my_pitch_shift_sink sink_properties=device.description="Pitch_Shift_Output_Sink" - 然后重启PulseAudio生效:
pulseaudio -k && pulseaudio --start
内容的提问来源于stack exchange,提问作者James Bond

