如何使用 pipewire 将左右声道合并为单声道

如何使用 pipewire 将左右声道合并为单声道

使用 pipewire 或 wireplumber 我们如何通过组合左声道和右声道使立体声输出设备变成单声道?

这个问题看起来很傻,但它非常有用,无论是你的扬声器无法重现立体声,还是出于可访问性原因,我们都应该有一个选项来轻松切换系统上的单声道输出。但是,是的,我们在 GNOME 上没有这个选项,然而

按照指南,我将回答我自己的这个问题。

因此,这是针对 pipewire 的,因为我使用的是 Ubuntu 23.04,并且它使用了默认音频服务器。经过大量搜索,我无法使用 pipewire 或 wireplumber 找到这个简单问题的答案。因此,在找到一种方法使 Gnome-Control-Center 音频设置的输出设备上出现一个选项,以使用我选择的名称的单声道输出后,我将与大家分享我实现该目标所采取的步骤。

答案1

因此,为了从立体声输出实现真正的单声道,我们需要修改 pipewire 配置。

这是 pipewire 文档的一部分,它帮助我实现了所需的单声道接收器: Pipewire - 模块组合流

因此,首先我们需要找出我们在配置文件中使用的名称node.device,如WirePlumber - ArchWiki从终端运行:

$ wpctl status

PipeWire 'pipewire-0' [0.3.56, user@hostname, cookie:1163266174]

Audio
 ├─ Devices:
 │      42. HD Audio Controller                 [alsa]
 │     105. USB PnP Audio Device                [alsa]
 ├─ Sinks:
 │  *   48. HD Audio Controller Analog Stereo   [vol: 0.50]
 ├─ ...
 ├─ Sources:
 │  *  101. USB PnP Audio Device Mono           [vol: 0.74]
 └─ ...

标有 的*是您当前正在使用的,我们正在寻找接收器,数字表示 ID,因此我们可以使用$ wpctl inspect [ID]

$ wpctl inspect 48

id 48, type PipeWire:Interface:Node
    ...
    ...
  * factory.id = "18"
    factory.mode = "merge"
    factory.name = "api.alsa.pcm.sink"
    ...
  * media.class = "Audio/Sink"
  * node.description = "HD Audio Controller Analog Stereo"
  * node.name = "alsa_output.pci-0000_08_00.4.analog-stereo"
  * node.nick = "ALC1220 Analog"
    ...
  * object.path = "alsa:pcm:1:front:1:playback"
  * object.serial = "49"
    ...

我们希望获得节点名称

现在我们收集了所有内容,我们可以结合来自两个维基百科的信息。

  • 在您的 pipewire 分发文件夹中(通常/usr/share/pipewire),找到该pipewire.conf文件并添加此配置并进行适合您需要的修改。
  • 在该context.modules部分:
context.modules = [
{   name = libpipewire-module-combine-stream
        args = {
            combine.mode = sink
            node.name = "combine_stereo_to_mono_sink" # Can be any name of your choice
            node.description = "Mono Speakers" # This is the name that will appear in the sound settings
            combine.latency-compensate = false
            combine.props = {
            audio.position = [ MONO ]
            }
            stream.props = {
                stream.dont-remix = true
            }
            stream.rules = [
            {   matches = [
                    {   media.class = "Audio/Sink"
                        node.name = "alsa_output.pci-0000_08_00.4.analog-stereo" # Your node.name here
                    } ]
                    actions = { create-stream = {
                            audio.position = [ FL FR ]
                            combine.audio.position = [ MONO ] # These both are what combine both channels into one
                    } } }
            ]
        }
    }
]

您可以直接复制里面的部分context.modules=[],也可以创建一个新文件并添加到pipewire.conf.dpipewire-pulse.conf.d目录中。

保存文件后,重新启动系统或重新启动 pipewire 和 wireplumber:

$ systemctl --user restart pipewire pipewire-pulse wireplumber

这是我的声音设置: 单声道扬声器 单声道扬声器2

相关内容