在Ubuntu 20.04中将Pulseaudio替换为Pipewire

自从我安装了Ubuntu 20.04以来,我遇到了一个问题,系统无法检测到我的蓝牙耳机麦克风。我的耳机在Windows下工作得很好。此外,在Ubuntu中我也无法从AD2P切换到HFP。所以我的最终想法是移除pulseaudio并安装pipewire,希望这样能解决我的问题。
请问有人可以提供具体的步骤吗?我已经搜索了很多次,但没有找到正确的步骤。
非常感谢!

https://askubuntu.com/questions/1333404/how-to-replace-pulseaudio-with-pipewire-on-ubuntu-21-04 - jasmines
这个回答解决了你的问题吗?如何在Ubuntu 21.04上用Pipewire替换PulseAudio? - jasmines
@jasmines 我尝试了这个解决方案,但即使安装了pipewire,我的问题仍然没有解决。 这是一个文件,你可以在里面看到我正在使用AD2P,但它无法检测到我的蓝牙耳机麦克风。https://imgur.com/a/hIZZwdY 难道pipewire不应该让AD2P与你的麦克风一起工作吗? - 1nfern0
9个回答

我曾经遇到过Oneplus Wireless Z Bass版的同样问题。我的耳机麦克风无法被PulseAudio检测到,问题在于我的耳机只支持HFP配置文件,而不支持HSP配置文件。经过两天的尝试,我找到了解决方案,即将PulseAudio替换为支持HSP、HFP和A2DP的PipeWire音频服务器。因此,无需安装任何其他实用程序,如ofonophonesim。值得注意的是,即使按照所有配置ofono在PulseAudio中的步骤,我的问题仍未解决。所以我提出了用PipeWire替换PulseAudio的步骤。
这是我撰写的详细文章来解决这个问题,我也在这里添加了步骤。您可以按照它,并很可能能够解决您的问题。 蓝牙耳机麦克风未被检测到 打开终端并按照以下步骤操作:
我们将使用PPA将Pipewire添加到Ubuntu 20.04中,该PPA定期维护:
sudo add-apt-repository ppa:pipewire-debian/pipewire-upstream
要更新系统中的PPA软件包,请执行以下操作:
sudo apt update 安装软件包:
sudo apt install pipewire 此外,还需要安装一个与Pipewire相关的依赖项,否则您将面临“安装pipewire后蓝牙耳机无法连接”的问题。请执行以下操作安装依赖项:
sudo apt install libspa-0.2-bluetooth
现在,安装客户端库:
sudo apt install pipewire-audio-client-libraries
重新加载守护程序:
systemctl --user daemon-reload
禁用PulseAudio:
systemctl --user --now disable pulseaudio.service pulseaudio.socket
如果您使用的是Ubuntu 20.04,还需要通过以下方式“屏蔽”PulseAudio:
systemctl --user mask pulseaudio

我不确定,但如果可能的话,你可以尝试在其他版本上运行这个。
9. 在 Pipewire 的新更新之后,你还需要启用 pipewire-media-session-service

   systemctl --user --now enable pipewire-media-session.service

你可以通过以下方式确保Pipewire正在运行: ``` pactl info ``` 该命令将提供以下输出,其中在 "Server Name" 中你可以看到: ``` PulseAudio (on PipeWire 0.3.28) ``` 现在应该正常工作,你可以看到你的麦克风。
如果它没有显示出来,那么尝试通过以下命令重新启动Pipewire:
systemctl --user restart pipewire

编辑:如果您已经安装了ofono和phonesim,请从系统中卸载它们。
sudo apt remove ofono
sudo apt remove ofono-phonesim

如果您的麦克风仍然没有显示出来,您可以尝试重新启动一次,并再次移除和配对您的蓝牙设备,以检查是否现在可以工作。
希望我已经帮助您解决了问题。
如果您想撤销我们所做的所有更改,您可以使用以下方法:
systemctl --user unmask pulseaudio
systemctl --user --now disable pipewire{,-pulse}.{socket,service}    
systemctl --user --now enable pulseaudio.service pulseaudio.socket

我在Ubuntu 21.04上遇到了耳机无法被检测的同样问题。我尝试了这个解决方案,但现在声音设置中的耳机选项下没有HSP/HFP选项。只有AAC编解码器的A2DP Sink和SBC编解码器的A2DP。你有什么想法为什么会这样吗? - BenM
你尝试过重新启动系统吗?还可以给我看一下以下命令的输出: pactl info 此外,你需要尝试重新启动 pipewire,解除配对并重新配对你的设备。 - 1nfern0
是的,我尝试重新启动了我的系统。我还重新启动了Pipewire。pactl info的输出如下:服务器字符串:/run/user/1000/pulse/native 库协议版本:34 服务器协议版本:35 是否本地:是 客户端索引:83 块大小:65472 用户名:ben 主机名:ben-desktop 服务器名称:PulseAudio(在PipeWire 0.3.28上) 服务器版本:14.0.0 默认采样规范:float32le 2ch 48000Hz 默认通道映射:front-left,front-right 默认音频输出:bluez_output.AC_12_2F_24_03_B1.a2dp-sink 默认音频输入:bluez_output.AC_12_2F_24_03_B1.a2dp-sink.monitor Cookie: 0e10:4a04 - BenM
我假设你的耳机在Windows和Android/Mac上都能完美运行。我的理解正确吗? - 1nfern0
是的,它在Windows和Android上完美运行(从未尝试过Mac或iOS)。 - BenM
你是不是通过以下命令屏蔽了pulseaudio: systemctl --user mask pulseaudio 在安装pipewire之后,你的蓝牙服务和配对、解除配对设备是否正常工作? - 1nfern0
是的,我确实掩盖了PulseAudio,并且耳机的配对/取消配对也正常工作。 - BenM
你可以尝试通过安装蓝牙管理器来切换到HSP/HFP配置文件吗?即使我的麦克风没有被检测到,我仍然能够看到HSP/HFP配置文件,但无法切换。这有点奇怪。使用以下命令安装Blueman:sudo apt-get install -y blueman - 1nfern0
1我已经尝试过从蓝牙管理器切换配置文件,但是HSP/HFP配置文件也没有列出来。然而,我找到了问题所在。几周前,我曾尝试使用ofono来解决这个问题,就像你在文章中提到的那个AskUbuntu帖子一样,我意识到我仍然安装了ofono。我只需要卸载ofono,现在我的麦克风通过Pipewire完美地工作了。感谢你的帮助。我一直在努力让我的麦克风在Ubuntu上正常工作。 :) - BenM
太好了,听到这个消息很高兴。我会在回答中更新相关内容。谢谢你的信息! - 1nfern0
@jasmines 看起来你的系统中没有启动 pipewire 服务。我猜你可能在其中某个步骤上遗漏了一些内容。你能否展示一下 pactl info 的输出结果? - 1nfern0
@BenM,遇到了类似的问题。在Arch上HSP/HFP可以工作,但在使用pipewire的Ubuntu上却不能。通过移除ofono解决了这个问题。 - Anton Kazennikov
这与华为Freebuds Pro兼容非常好!谢谢你。我不得不删除libldac,这可能是在尝试将其与pulseaudio配合使用时先前安装的,并与安装libspa-0.2-bluetooth产生冲突。现在所有耳机和音频系统的音频都可以正常工作。媒体文件的播放甚至似乎更加流畅了。 - DarkScrolls
当我试图在整个系统范围内进行此操作时,它无法正常工作。我该如何配置才能使其正常运行? - YamiYukiSenpai
我想问一下,对于能够使用这个的人来说,当处于HFP/HSP模式时,音质是否比A2DP显著较差?对我来说,我成功让它工作了并且是可以接受的。 - Geralt
@Gerait 是的,当我第一次启用HFP/HSP时,音频效果非常糟糕。为了获得稍微好一些的音频效果,你可以通过取消注释/etc/pipewire/media-session.d/bluez-monitor.conf中的一行来启用mSBC编解码器,该行内容为bluez.msbc-support = true。然后在Ubuntu声音设置中选择该音频编解码器。音质仍然不如A2DP好,但这是在使用耳机上的耳机配置文件时会发生的情况。 - BenM
值得注意的是,PulseAudio 15.0 应该修复了与“消失”的蓝牙配置文件协商有关的问题,支持带有 A2DP 的麦克风。详情请参阅 https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/15.0/#supportforhfpbluetoothprofiles、https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/491 和 https://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git/commit/?id=839e7ebed5b5354ffb623511a49499ca6707cd64 - Brad J
只是按照指示操作,但键盘上的音量控制无法正常工作。解决方法是在我的主目录中删除/移动 .config/pulse 文件夹。现在,我可以选择 SBC、SBC-XQ 和 AAC 作为 A2DP 的选项,以及 CVSD 和 mSBC 作为 HSP/HFP 的选项,并且适用于 Jabra Elite 85t。 - Moritz
你可能还需要执行 sudo apt remove pulseaudio-module-bluetooth 命令,否则蓝牙可能会出现问题。 - Leo Alekseyev
无法启用单元:单元文件 /etc/xdg/systemd/user/pipewire-media-session.service 被屏蔽。 - mondjunge
你是一个绅士和学者。谢谢你分享这个。对我很有帮助。 - Jesse Roper
这里没什么运气 - 我看到Pipewire已经安装了,但是没有找到任何声音设备(包括内置的Jack)。在我回滚并卸载所有东西后,系统无法启动 - 没有登录界面。通过按下Ctrl + Alt + F2并重新安装Gnome apt install --reinstall gnome,我成功修复了它(也许这对其他人有帮助)。 - Jurosh

补充1nfern0的回答,按照所有步骤后,pactl info给我返回了连接失败。我通过运行以下命令解决了这个问题: systemctl --user --now enable pipewire pipewire-pulse
你可能还需要重新启动系统一次。

上面的答案很重要,还有一件可能的事情是你在/etc/pipewire/pipewire.conf中有一个旧的配置文件,这会阻止pipewire正常工作。我删除了整个/etc/pipewire目录,并重新安装了pipewire和pipewire-pulse来解决问题,现在一切都正常工作了。

1在我的情况下,我之前按照其他指南进行安装,但是什么都没成功。我只是按照答案进行了移除操作。现在它可以正常工作了。 - Adrug

我遇到了一些问题(太多了,以至于我都不知道从哪里开始)。
对我有效的方法是:
在按照上述步骤操作后,我在终端中提交了以下内容:
重新启动Pulse Audio:
mv ~/.config/pulse/ ~/.config/pulse.old
systemctl --user restart pulseaudio
mv ~/.config/pulse/ ~/.config/pulse.old pulseaudio --k && pulseaudio --start
重新安装Pulse Audio:
sudo apt update sudo apt install --reinstall -o Dpkg::Options::="--force-confmiss" pulseaudio
dpkg -L pulseaudio
rm $HOME/.config/pulse/*
启用Pipewire:
systemctl --global --now enable pipewire{,-pulse}.{socket,service}
sudo systemctl --global --now enable pipewire{,-pulse}.{socket,service}
sudo systemctl --global --now enable pipewire pipewire-pulse

sudo systemctl --user --now enable pipewire pipewire-pulse

sudo systemctl --user --now enable pulseaudio.service pulseaudio.socket

再次禁用pulseadio:

sudo pkill pulseaudio

sudo /etc/init.d/bluetooth restart

我不太确定哪个起了作用... 但是现在之后:

pactl info

我得到:
服务器字符串:/run/user/1000/pulse/native 库协议版本:35
服务器协议版本:35
是否本地:是
客户端索引:155
块大小:65472
用户名:*
主机名:*
服务器名称:PulseAudio(在PipeWire 0.3.58上)
服务器版本:15.0.0
默认采样规范:float32le 2ch 48000Hz
默认声道映射:前左,前右
默认输出:bluez_output.90_98_38_0B_87_BD.a2dp-sink
默认输入:alsa_input.pci-0000_00_1b.0.analog-stereo
Cookie:2b71:d622
所有这些工作都因为现在Ubuntu设置显示蓝牙设备的AAC编解码器。
希望这对某人有所帮助...

我遇到了“连接被拒绝”的问题。
Connection failure: Connection refused
pa_context_connect() failed: Connection refused

我按照以下修改后的步骤成功地将Pulseaudio替换为Pipewire。
步骤1:添加PipeWire PPA。
$ sudo add-apt-repository ppa:pipewire-debian/pipewire-upstream

第二步:安装pipewire-audio-client-libraries软件包
$ sudo apt update
$ sudo apt install pipewire pipewire-audio-client-libraries

第三步:安装一些额外的库,以便使用蓝牙耳机。
$ sudo apt install gstreamer1.0-pipewire libpipewire-0.3-{0,dev,modules} libspa-0.2-{bluetooth,dev,jack,modules} pipewire{,-{audio-client-libraries,pulse,media-session,bin,locales,tests}}

第四步:在systemd中重新加载守护程序。
$ systemctl --user daemon-reload

第五步:在Ubuntu中禁用PulseAudio。
$ systemctl --user --now disable pulseaudio.service pulseaudio.socket

第六步:启动PipeWire并启用。
$ systemctl --user --now enable pipewire pipewire-pulse

第七步:确保PipeWire的命令
$ pactl info

对我来说很有效,谢谢! - undefined

完成1nfern0's answer中描述的步骤(当PipeWire工作时),您可以使用以下Bash脚本在A2DP(高保真播放,麦克风禁用)和mSBC(用作耳机,麦克风启用)之间切换:
#!/bin/bash

# Toggle your bluetooth device (e.g., Bose Headphones) between A2DP mode (high-fidelity playback with NO microphone) and HSP/HFP, codec mSBC (lower playback quality, microphone ENABLED)
function tbt {
    current_mode_is_a2dp=`pactl list | grep Active | grep a2dp`
    card=`pactl list | grep "Name: bluez_card." | cut -d ' ' -f 2`

    if [ -n "$current_mode_is_a2dp" ]; then
        echo "Switching $card to mSBC (headset, for making calls)..."
        pactl set-card-profile $card headset-head-unit-msbc
    else
        echo "Switching $card to A2DP (high-fidelity playback)..."
        pactl set-card-profile $card a2dp-sink
    fi
}

以上脚本是从以下链接进行改编的: https://bbs.archlinux.org/viewtopic.php?pid=1973205#p1973205

pactl info 给了我一个连接拒绝的错误(在按照Ubuntu 20.04 LTS上被接受的答案的第9步之后)。我通过使用wireplumber而不是pipewire-media-session-service来解决了这个问题。


1你能详细说明一下吗?你是如何“使用”它的呢?如果你已经运行了启用pipewire-media-session-service的命令,会发生什么情况呢? - Joseph Garvin
1刚刚给这个回答点了个踩,因为它没有明确说明如何在Ubuntu 20.04上安装/启用和使用WirePlumber。 - meetnick

➜  / sudo systemctl --global --now enable pipewire{,-pulse}.{socket,service}
Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined (consider using --machine=<user>@.host --user to connect to bus of other user)
➜  / sudo systemctl --global --now enable pipewire pipewire-pulse
Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined (consider using --machine=<user>@.host --user to connect to bus of other user)
➜  / sudo systemctl --user --now enable pipewire pipewire-pulse
Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined (consider using --machine=<user>@.host --user to connect to bus of other user)
➜  / sudo systemctl --user --now enable pulseaudio.service pulseaudio.socket
Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined (consider using --machine=<user>@.host --user to connect to bus of other user)
➜  / 

我尝试了上面的所有答案,但仍然无法获得mSBC编解码器。
在bluez-monitor.conf中,我已经启用了以下选项: #bluez5.enable-sbc-xq = true #bluez5.enable-msbc = true #bluez5.enable-hw-volume = true #bluez5.enable-faststream = true 请查看可用编解码器pactl info

1这并没有真正回答问题。如果你有不同的问题,可以点击提问来提出。如果你想在这个问题有新的回答时得到通知,你可以关注这个问题。一旦你积累了足够的声望,你也可以添加悬赏以吸引更多注意力。- 来自审阅 - David