如何在Pipewire中创建供Java TargetDataLine读取的虚拟音频源?
解决方案:用Pipewire创建镜像默认输出的虚拟音频源
直接创建镜像源的命令
无需多步操作,一条pw-loopback命令即可完成,核心是指定捕获默认输出的监听流并将其暴露为可读取的音频源:
pw-loopback --capture-props='media.class=Audio/Source node.name=output-mirror-source target.object=DEFAULT_SINK_MONITOR' --playback-props='media.class=Audio/Sink node.name=unused-loopback-sink' -m '[FL FR]'
target.object=DEFAULT_SINK_MONITOR:指定捕获系统默认音频输出的监听流(即扬声器正在播放的内容)media.class=Audio/Source:将loopback的捕获端标记为音频源,Java的TargetDataLine可识别这个名为output-mirror-source的设备--playback-props设置的sink是必要占位符,因为pw-loopback需要两端节点存在,该sink不会被实际使用
针对你之前尝试的错误纠正
- 未指定捕获目标:最初的命令没有告诉loopback要捕获的音频流,无法生成有效源,必须通过
target.object指定默认输出的监听端。 - media.class参数倒置:第二个命令中
--playback-props和--capture-props的media.class设置错误,应该是捕获端作为Audio/Source,播放端指向要监听的目标。 - pw-link端口不匹配:第三个方法中连接的端口名称错误,正确的声道级连接命令应为:
不过这种多节点方式冗余,不如直接使用第一条命令高效。pw-link cliradio-sink:monitor_FL cliradio-source:playback_FL pw-link cliradio-sink:monitor_FR cliradio-source:playback_FR
验证创建结果
执行命令后,可通过以下命令确认虚拟源是否存在:
pw-cli list-objects | grep output-mirror-source
Java程序中选择output-mirror-source作为音频源,即可读取系统内部播放的音频。
内容的提问来源于stack exchange,提问作者shinysocks
相关产品推荐
相关产品推荐

