耳机麦克风无法正常工作。

我正在尝试在我的Ubuntu 13.10上使用耳机。我的耳机是诺基亚BH-905i,可以通过蓝牙或绿色+粉红色线缆连接。
如果我使用蓝牙,声音质量很差,或者麦克风无法工作。如果我尝试在声音设置的输入和输出选项卡中选择“耳机”选项,它们会同时禁用。
在输出选项卡中,我使用的是“高音质A2DP”,因为它可以改善声音质量。
我该如何让我的麦克风工作?声音输出正常。

已经在上面评论过了,HFP是双向的,而A2DP是单向的。但它们也使用不同的连接: https://stackoverflow.com/questions/40033827/what-is-the-difference-between-acl-and-sco-link-in-bluetooth (或其更新版本) - user728938
1看看这个 https://github.com/4khi1/i3blocks-airpods - Akhil
11个回答

正如之前指出的,A2DP是单向的,每次需要使用麦克风时,您必须切换到HSP配置文件。但是手动操作并不理想,并且除非应用程序为流设置media.role=phone(大多数非VoIP应用都没有这样做),否则pulseaudio默认不会自动切换。

但是从Pulseaudio v. 11.0开始,可以在应用程序请求麦克风访问时自动切换配置文件,但默认情况下是禁用的。

  1. /etc/pulse/default.pa中找到load-module module-bluetooth-policy
  2. 将其更改为load-module module-bluetooth-policy auto_switch=2

现在,每当应用程序请求麦克风访问时,pulseaudio将自动将设备配置文件切换为HSP,并在关闭流后将其切换回A2DP。

您需要重新加载pulseaudio模块以使更改生效:


谢谢。我的索尼SBH24麦克风只能在HSP模式下工作。这有助于自动切换。 - Rohit Karadkar
我的Marshall MID现在可以用了!谢谢你! - Serhii Polishchuk
这对我的JBL LIVE650BTNC没用,你知道原因吗? - Fábio Filho
似乎把我的耳机锁定在了HSP/HFP模式下。但至少现在麦克风能够稳定使用了。 - Ufos
Airpods Pro用不了。唉。 - Sephethus
1这真是令人沮丧,为什么Linux不像Android一样支持带麦克风的A2DP呢? - user1366476
16尝试运行pulseaudio -D时,出现了“E:[pulseaudio] main.c:Daemon启动失败。”错误。 - Yogi Katba
@YogiKatba 我也遇到了同样的错误,现在无法听到任何声音。 - Mayur Dangar
我也遇到了同样的错误。你这边有什么进展吗,@Glub? - Deep Dalsania
7如果守护进程启动失败,请尝试使用命令systemctl --user restart pulseaudio - backslashN
1当我们将同一设备连接到手机时,即使在使用麦克风的同时,我们也可以听到高质量的音频(可能是A2DP)。那么为什么它的限制是A2DP而不是Ubuntu呢? - Nilesh
systemctl --user restart pulseaudio 失败,显示 无法重新启动 pulseaudio.service: 单元 pulseaudio.service 被屏蔽。 - Peter

设计上,蓝牙A2DP配置文件是单向的。除非我们的耳机和适配器能够同时配对到HSP和A2DP协议,或者应用程序根据需要从A2DP切换到HSP,否则我们无法使用麦克风。
另请参阅关于错误#508522的这场启发性讨论。

我刚刚在Ubuntu 16.04 LTS上为我的Bose QC35 II安装了一个解决方案,解决了蓝牙无法选择麦克风的问题。
由于我三星笔记本电脑上的内置麦克风离风扇太近,在视频通话中会听起来像是在飞机内部一样。
解决方案是使用Blueman,它为蓝牙添加了功能。
安装方法:sudo apt-get install blueman
在WiFi停止工作后(可能与此无关,但以防万一),我不得不重新启动网络管理器(sudo service network-manager restart)。

Blueman GUI

我现在可以切换到耳机头单元(HSP/HFP),并在声音设置中选择耳机麦克风。

Sound settings - input

虽然它不像安卓那样自动切换,但还是比待在巨无霸飞机仓库里要好一些!


7问题是如何在A2DP模式下让麦克风工作,据我所知,这仍然不可能。在HFP模式下使用麦克风相对简单,并且应该在无需任何额外应用的情况下正常工作。如果你需要blueman来使其工作,那么可能存在你音频设置方面的问题。 - Takkat
嗯,Takkat,使用蓝牙麦克风耳机在Ubuntu上的问题是众所周知的,所以这并不是麦克风问题的音频设置...还有很抱歉,昨天我无意中给你的答案点了个踩,无法撤销,真是遗憾。=( - Valross.nu
http://en.wikipedia.org/wiki/Bluetooth_profile#Advanced_Audio_Distribution_Profile_.28A2DP.29 - 这是蓝牙配置文件定义的固有特性。无论我们或任何其他操作系统如何努力,都无法克服这个问题 - 但你说得很对,HFP模式的问题仍然存在。 - Takkat
1我在这里不同意,因为大多数操作系统在两个协议之间进行切换时并不需要用户干预。正如提到的,Android、Windows或iOS会自动切换,而Ubuntu则不会...所以已经有一个自动化的解决方案存在于其中... - Valross.nu
2在Ubuntu 18.04上,当我尝试切换到HFP时,出现了"Failed to change profile to headset_head_unit"的错误提示。 - kommradHomer
4尝试设置HSP/HPF时,我遇到了以下错误:在Blueman的页脚中显示“无法将配置文件更改为headset_head_unit”。这里有什么提示吗? - xmar

除了@Glub提到的步骤之外,即:
  1. /etc/pulse/default.pa中找到load-module module-bluetooth-policy
  2. 将其更改为load-module module-bluetooth-policy auto_switch=2
我不得不重置Pulseaudio配置并重新启动Pulseaudio模块。
mv ~/.config/pulse/ ~/.config/pulse.old
systemctl --user restart pulseaudio

这个 - https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Bluetooth/#index5h2 对我有帮助。 别忘了安装ofono和ofono-phonesim并启动服务。

The necessity to provide a modem to oFono makes the headset setup rather cumbersome. If you do not have a GSM/UMTS modem connected to your system (like in most desktop environments), you need a modem emulator. Unfortunately oFono does not allow to use a mobile (hfp modem, see below) as a modem to support headsets.

The best emulator choice is "phonesim" because there is a version that is maintained together with ofono. Most distributions contain a package ofono-phonesim or similar while the git version can be found at git://git.kernel.org/pub/scm/network/ofono/phonesim.git.

To set up phonesim, first create or edit the file phonesim.conf in /etc/ofono. It should contain the following lines:

[phonesim]
Driver=phonesim
Address=127.0.0.1
Port=12345

Restart oFono and check with list-modems if the phonesim modem was found. Start phonesim with

ofono-phonesim -p 12345 /usr/share/phonesim/default.xml&

The paths to phonesim.conf and default.xml might be different if you compiled ofono and/or phonesim from source. Now you can enable the modem either by using the enable-modem script or by issuing the following command:

dbus-send --print-reply --system --dest=org.ofono /phonesim org.ofono.Modem.SetProperty string:"Powered" variant:boolean:"true"

list-modems should show that the modem is powered and online. If you want to play with the modem emulator, you can add the -gui option to the phonesim command. Then a GUI will pop up as soon as you enable the modem.

Once the modem is set up properly, you can connect your headset and the "Headset Head Unit (HSP/HFP)" profile should be available in pulseaudio.


你是如何安装phonesim的?我试着在我的Ubuntu 20.04上使用apt-get来安装,但是没有成功... - Arxeiss
我在基于Ubuntu 18.04 LTS的Mint 19上安装了这个。 - IvanTheFirst

IvanTheFirst的回答的基础上,我创建了一个脚本,可以连接到我的启用了麦克风的蓝牙耳机。由于找不到带有Phonesim的软件包,我还需要编译Phonesim。为了节省您的时间,这是我需要安装的软件包qtdeclarative5-dev,qt5-default
#!/bin/bash

# https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Bluetooth/#index5h2
# https://git.kernel.org/pub/scm/network/ofono/phonesim.git
# to compile phonesim project, install these packages 'qtdeclarative5-dev,qt5-default'
# enable job control
set -m

# retrieve process in the form "7260/phonesim"
PHONESIM=$(netstat -antp 2>/dev/null | grep phonesim | awk '{print $7}')

# extract process id
PHONESIM="${PHONESIM/\/phonesim/}"
if [ -n "$PHONESIM" ]; then
  echo killing old phonesim process [$PHONESIM] 
  kill -9 $PHONESIM
fi

echo "starting phonesim on port 12345"
phonesim -p 12345 /usr/share/phonesim/default.xml&

echo "enable modem"
exit_status=1
while [ $exit_status -ne 0 ]; do
  sudo dbus-send --print-reply --system --dest=org.ofono /phonesim org.ofono.Modem.SetProperty string:"Powered" variant:boolean:"true"
  exit_status=$?
done

echo "restart bluetooth"
sudo service bluetooth restart

# MAC_ADDRESS=$(hcitool scan | grep "Galaxy Buds" | awk '{print $1}')
MAC_ADDRESS=D8:55:75:67:D1:68

while [ -z $MAC_ADDRESS ]; do   
  MAC_ADDRESS=$(hcitool scan | grep "Galaxy Buds" | awk '{print $1}')
done

sleep 5
echo "connect to Galaxy Buds [$MAC_ADDRESS]"
bluetoothctl <<< "connect $MAC_ADDRESS
                  quit"

echo "reattach to phonesim process"
fg

有点晚加入派对,但由于这种东西在Linux中仍然不起作用,我也会在这里分享我的经验。
我买了一个华硕BT400的适配器,它使用了Broadcom BCM20702A1芯片(usb设备0b05:17cb)。我遇到了与OP描述的相同问题。A2DP正常工作(即只有输出),HSP/HFP既没有输出也没有输入。
我看了一些关于旧错误的报道: 这个链接的解决方法/修复方法适用于Plugable的插件式设备(它使用相同的芯片)。
我对问题的理解并没有变得更好,从一个随机的AWS服务器上下载一个与问题有些关联的产品的任意固件似乎有点可疑。
最后,我找到了这个GitHub gist,描述了如何使用Asus Windows驱动程序中的固件:
然后我终于明白了:这些蓝牙设备在交付时并不完全功能齐全,它们需要固件更新才能完全工作。Windows驱动程序捆绑了各种固件文件,以支持驱动程序所支持的所有变体。我不太清楚MacOS是如何做到的,但我认为它的工作方式类似。
所以,只需从他们的下载页面下载最新的驱动程序,然后提取正确的固件文件并将其放置在/lib/firmware/brcm/中(正确命名),问题就解决了。
简而言之,Windows驱动程序包含了所需的固件文件。

我已经安装了Pipewire(这些命令适用于Ubuntu 21.04,但可以很容易地适应之前的Ubuntu版本)。
  1. 使用以下命令安装PPA:
sudo add-apt-repository ppa:pipewire-debian/pipewire-upstream
sudo apt-get update

安装pipewire和几个相关的实用工具。
sudo apt install pipewire pipewire-pulse \
  pipewire-tests pipewire-locales gstreamer1.0-pipewire libspa-0.2-bluetooth \
  libspa-0.2-jack pipewire-audio-client-libraries

禁用pulseaudio
sudo systemctl disable --global pulseaudio

启用pipewire
sudo systemctl enable --global pipewire-pulse

检查pipewire是否集成,检查此命令的输出。
$ pactl info | grep "Server Name"
Server Name: PulseAudio (on Pipewire 0.3.35)

现在在设置中更改它 -> 声音 -> 输出,选择“耳机头单元(HSP/HFP)”,你会发现“输入”也会改变麦克风。
参考 https://askubuntu.com/a/1350854/170833


使用Yurri S提供的修复方法,该方法也适用于蓝牙耳机:
在使用美观但已经令人烦恼的20.04版本时,我在SuperUser的另一篇帖子中找到了解决方案。在我的情况下,以下步骤对我有所帮助:
1. 使用以下命令获取您机器型号的音频编解码器: ``` cat /proc/asound/card*/codec* | grep Codec ``` 在我的情况下,我看到了以下音频和视频编解码器: ``` Codec: Realtek ALC233 Codec: Nvidia GPU 94 HDMI/DP ```
2. 访问www.kernel.org,查找该编解码器的版本,并获取其完整名称。在我的情况下,对于`Realtek ALC233`,它是`alc233-eapd`。
3. 创建/更新`/etc/modprobe.d/alsa-base.conf`文件,并添加以下行,将模型替换为您自己的: ``` options snd-hda-intel model=alc233-eapd ```
4. 重新启动机器。
下载完成后,使用以下命令下载blueman
sudo apt-get install blueman

然后转到“蓝牙设备”,在您连接的耳机上“右键单击”,将鼠标悬停在“音频配置文件”上,然后选择“耳机主机单元”。