如何在 PipeWire(22.10 版)中将立体声音频输出混音为单声道?

如何在 PipeWire(22.10 版)中将立体声音频输出混音为单声道?

我需要一种方法来设置单声道音频输出在我的系统上。
我以前使用过这个解决方案:我可以将立体声音频混音为单声道吗?

pacmd load-module module-remap-sink sink_name=mono master=NAME_OF_AUDIO_SINK \
 channels=2 channel_map=mono,mono

但是,当我升级到 Kubuntu 22.10 时,它停止工作了,大概是因为它现在使用 PipeWire 而不是 PulseAudio。当我这样做时,pacmd list-sinks我得到:
No PulseAudio daemon running, or not running as session daemon.

我如何在 PipeWire 上执行相同操作(将立体声音频输出混音为单声道)?

我发现这里类似问题的解决方案,但如果我理解正确的话,那是为了获得单声道输入. 我想要单声道输出
。如果我可以使用 GUI 轻松将其切换到单声道/立体声,或者仅在连接我的愚蠢耳机时将其设置为单声道,那就更好了。

附言:他们确实应该在系统设置>音频中将单声道作为配置文件/配置来实现,但是好吧......

答案1

我设法通过将立体声流合并到单声道接收器来实现真正的单声道输出Pipewire - 模块组合流

用于$ wpctl status获取所需接收器的接收器 ID,并$ wpctl inspect [ID]获取要在配置文件上使用的 node.name 变量。

$ 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]
 └─ ...

$ 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=[],也可以创建一个新文件并添加到~/.config/pipewire/pipewire.conf.d/~/.config/pipewire/pipewire-pulse.conf.d目录中。

  • 在该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
                    } } }
            ]
        }
    }
]

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

$ systemctl --user restart pipewire pipewire-pulse wireplumber

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

答案2

我通过安装使单声道音频输出在 PipeWire 中工作简易效果均衡器。

sudo apt install easyeffects
  1. 输出 > 效果 > 添加效果 > 立体声工具
  2. 在立体声矩阵选项卡上,选择“单声道和 L+R”。“立体声到中侧”似乎也可以工作。
  3. 在“偏好设置”中,确保启用“系统启动时启动服务”。
  4. 如果需要,为“单声道”和“立体声”创建预设(可选)。

EasyEffects - 将音频输出混合为单声道 EasyEffects - 系统启动时启动服务

答案3

也许你可以使用qpwgraph并以类似的方式链接 L 和 R 通道:

在此处输入图片描述

配置文件可以保存,但为此我将您重定向到文档。以下是有关在 ArchWiki 上使用 pipewire 保存和加载配置文件的一些信息:https://wiki.archlinux.org/title/PipeWire#PipeWire_patch_sets_for_command_line

答案4

  • 无需安装其他程序的另一种解决方案是为 PipeWire 创建单声道输出配置文件。

  • 例如,可以针对每个用户会话进行以下配置:

    • 使用以下内容mono-playback.conf创建一个:~/.config/pipewire/pipewire.conf.d

      context.modules = [
          { name = libpipewire-module-loopback
              args = {
                  node.description = "Mono Playback Device"
                  capture.props = {
                      node.name      = "mono_output"
                      media.class    = "Audio/Sink"
                      audio.position = [ MONO ]
                  }
                  playback.props = {
                      node.name      = "playback.mono_output"
                      audio.position = [ MONO ]
                      node.passive   = true
                  }
              }
          }
      ]
      
    • 重新启动 pipewire 服务:

      systemctl --user restart pipewire{,-pulse}.{service,socket}
      
    • 这将创建一个名为的虚拟设备(在本例中为接收器)Mono Playback Device

    • 可以通过音频小程序或系统设置中的 GUI 选择该设备。使用 KDE Plasma 音频小程序的示例。

  • 如需进一步了解选项,您可以参考PipeWire 维基虚拟设备部分。

相关内容