PulseAudio无法将卡配置文件设置为“ a2dp_sink”。如何查看日志并找出问题所在?


31

我目前已经安装了ubuntu 16.04和a2dp,用于全新安装,我希望将其保留为最后一个选择。当配对从蓝牙设置中删除并再次配对时,有时可以设法将其保存在a2dp配置文件中,但是如果断开了耳机再重新连接,则a2dp配置文件将不再起作用(尽管它说是在a2dp上),但它只能工作切换到HSP / HSF之后,则无法在a2dp上进行设置。

我试着做:

 pacmd set-card-profile <index> a2dp_sink

但是出现以下错误:

"Failed to set card profile to 'a2dp_sink'"

我对Linux缺乏经验,所以我不知道如何获取日志或在日志中查找什么,但是我是从pacmd列表卡中获得的:

工作时间:

name: <bluez_card.50_C9_71_97_A1_86>
driver: <module-bluez5-device.c>
owner module: 27
properties:
    device.description = "Jabra REVO a4.0.0"
    device.string = "50:C9:71:97:A1:86"
    device.api = "bluez"
    device.class = "sound"
    device.bus = "bluetooth"
    device.form_factor = "headset"
    bluez.path = "/org/bluez/hci0/dev_50_C9_71_97_A1_86"
    bluez.class = "0x240404"
    bluez.alias = "Jabra REVO a4.0.0"
    device.icon_name = "audio-headset-bluetooth"
    device.intended_roles = "phone"
profiles:
    headset_head_unit: Headset Head Unit (HSP/HFP) (priority 20, available: unknown)
    a2dp_sink: High Fidelity Playback (A2DP Sink) (priority 10, available: unknown)
    off: Off (priority 0, available: yes)
active profile: <a2dp_sink>
sinks:
    bluez_sink.50_C9_71_97_A1_86/#6: Jabra REVO a4.0.0
sources:
    bluez_sink.50_C9_71_97_A1_86.monitor/#10: Monitor of Jabra REVO a4.0.0
ports:
    headset-output: Headset (priority 0, latency offset 0 usec, available: unknown)
        properties:

    headset-input: Headset (priority 0, latency offset 0 usec, available: unknown)
        properties:

如果没有:

name: <bluez_card.50_C9_71_97_A1_86>
driver: <module-bluez5-device.c>
owner module: 25
properties:
    device.description = "Jabra REVO a4.0.0"
    device.string = "50:C9:71:97:A1:86"
    device.api = "bluez"
    device.class = "sound"
    device.bus = "bluetooth"
    device.form_factor = "headset"
    bluez.path = "/org/bluez/hci0/dev_50_C9_71_97_A1_86"
    bluez.class = "0x240404"
    bluez.alias = "Jabra REVO a4.0.0"
    device.icon_name = "audio-headset-bluetooth"
    device.intended_roles = "phone"
profiles:
    headset_head_unit: Headset Head Unit (HSP/HFP) (priority 20, available: unknown)
    a2dp_sink: High Fidelity Playback (A2DP Sink) (priority 10, available: yes)
    off: Off (priority 0, available: yes)
active profile: <off>
ports:
    headset-output: Headset (priority 0, latency offset 0 usec, available: yes)
        properties:

    headset-input: Headset (priority 0, latency offset 0 usec, available: unknown)
        properties:

拥有的模块是:

name: <module-bluez5-device>
argument: <path=/org/bluez/hci0/dev_50_C9_71_97_A1_86>
used: 0
load once: no
properties:
    module.author = "João Paulo Rechi Vita"
    module.description = "BlueZ 5 Bluetooth audio sink and source"
    module.version = "8.0"

我已经尝试修改/etc/bluetooth/audio.conf并安装blueman,但是没有用。我也尝试重新安装bluez和pulseaudio,但没有任何改变。

我有什么办法可以知道出什么问题并解决吗?


您能否解释一下您从何处获得此信息?什么是索引?谢谢!
Ezequiel Moreno

Answers:


23

基于“活动配置文件:<off>”行,声音配置文件未激活。

pavucontrol是一种易于使用的用于更改配置文件的程序。您可以使用安装它sudo apt install pavucontrol -y。然后,如果您在Kubuntu上并输入pavucontrol,则从命令行或Alt + F2运行pavucontrol。

选择配置选项卡,然后尝试更改耳机的配置文件,然后查看是否为您更新。似乎在Linux中仍然存在蓝牙a2dp的错误,它影响了我的16.04安装中的两个。如果已经说过A2DP将其更改为OFF,请断开蓝牙小程序中的设备,然后重新连接。然后,最后继续将配置文件更改回A2DP,它应该可以工作。

您也可以在命令行上尝试以下操作,它应该为您提供大多数选项卡。将下面的两个pacmd命令的数字2替换为当前的索引号。

pacmd set-card-profile 2 off
bluetoothctl
disconnect 50:C9:71:97:A1:86
connect 50:C9:71:97:A1:86
pacmd set-card-profile 2 a2dp_sink

对于执行相同操作的更复杂但自动化的方法,将配置文件循环关闭,然后返回到a2dp,但蓝牙设备不断开连接

index=`pacmd list-cards | grep bluez_card -B1 | grep index | awk '{print $2}'`;pacmd set-card-profile $index off; pacmd set-card-profile $index a2dp_sink 

我还要制作一个有效但草率的脚本来执行相同的操作,但还要断开并重新连接蓝牙耳机。它获取配置文件索引,因为每次断开设备并重新连接时索引都会更改。这是上面列出的耳机的设备ID的硬编码。

pacmd set-card-profile `pacmd list-cards | grep bluez_card -B1 | grep index | awk '{print $2}'` off; sleep 2 ; echo -e "disconnect 50:C9:71:97:A1:86\n quit"|bluetoothctl;sleep 5; echo -e "connect 50:C9:71:97:A1:86\n quit"|bluetoothctl; sleep 5; pacmd set-card-profile `pacmd list-cards | grep bluez_card -B1 | grep index | awk '{print $2}'` a2dp_sink

在测试过程中,由于设备尚未准备好更改音频配置文件,因此我将睡眠时间从5秒而不是3秒结束。您的结果可能相差几秒+/- 5秒。编辑潜在的陷阱。我确实发现偶尔需要运行两次较大的脚本才能运行它。我不确定增加睡眠时间是否会有所帮助,因为我尚未进行测试。但是我已经在两台使用相同品牌BT耳机的机器上使用了它,并且它正在按照预期的方式进行自动化,以使声音在耳机上正常工作。

最终,该问题将在蓝牙软件包中修复,但似乎仍会在新版本的Ubuntu和其他版本的Linux中继续出现。但是无论如何希望对您有帮助


>>如何查看日志并找出问题所在?<<如果您也可以回答这个问题,那将是很好的:)
kitingChris

在pavucontrol gui中将声音设置为蓝牙耳机对我有用。比Gnome声音工具效果更好。
QkiZ

1
2年后,我的Sony WH-H900N需要这个答案。
约阿基姆·威默​​斯泰特

(一年后)使用XFCE和blueman-manager,我经常不得不bluetoothctl disconnect aa:bb:cc:dd:ee:ff && bluetoothctl connect aa:bb:cc:dd:ee:ff在右键单击“设备”菜单之前允许我将音频配置文件切换为A2DP。当调出设备菜单花费的时间太长时,我有时还必须杀死一个子级的blueman-manager进程。
ericP

感谢您提供这些命令。这是与我的Ubuntu 18.04和Sony WH-1000xm2一起使用的唯一解决方法。我已在此要点上编写了脚本:gist.github.com/egelev/2e6b57d5a8ba62cf6df6fff2878c3fd4
egelev

19

为了将您的系统检测为A2DP接收器(例如,通过计算机扬声器播放手机中的音乐),请Enable=Source,Sink,Media,Socket[General]中添加/etc/bluetooth/audio.conf

完成此操作后,重新启动蓝牙守护程序

systemctl restart bluetooth

连接耳机设备

bluetoothctl
connect <MAC>

检查您的卡并设置个人资料

pacmd list-cards
pacmd set-card-profile <index> <profile>

1
使用ubuntu 16.04 /etc/bluetooth/audio.conf不可行,我应该在哪里写这行呢?
thebeancounter

这为我在Debian Sid上解决了问题,谢谢!
Xerz

@thebeancounter添加文件(如果该文件不存在)
Jimubao

有时,如果您失去了与A2DP接收器的连接,请尝试在bluetoothctl中“关闭电源”,然后“ systemctl重新启动蓝牙”,然后在bluetoothctl中“打开电源”并再次连接设备
Jimubao

1
在ARch / Manjaro工作!然而,该文件现在位于/etc/bluetooth/main.conf的最新版本
MCMZL

13

我在Ubuntu 16.04.1 LTS上遇到了这个问题,并通过在https://wiki.debian.org/BluetoothUser/a2dp中找到的GDM 解决了该问题。

具体来说,创建/编辑/var/lib/gdm3/.config/pulse/client.conf为:

autospawn = no
daemon-binary = /bin/true

然后

sudo chown gdm:gdm /var/lib/gdm3/.config/pulse/client.conf

我也加了 /etc/pulse/default.pa

load-module module-switch-on-connect

尽管这可能不是严格必要的。

重新启动后,我通过蓝牙管理器连接,能够成功将音频配置文件切换为a2dp_sink


我遇到的问题是,链接第一步中的bluez固件不可用,因此找不到用户gdm。另外,文件夹gdm3不存在,因此必须创建整个路径。
wordforthewise

我在Debian的那个链接上做了第二种解决方法,效果很不错!
Amfasis

5

lagerismi根据Jamie S的回答在此处在启动板上发布了一个脚本

  • 在脚本内的变量中更改设备的MAC地址!(可以在bluetoothctl->设备中找到)

  • 使脚本可执行 chmod a-x bluetooth_headphone_reactivation.sh

对于启动时自动执行(仅在耳机已打开的情况下有效):

  • 将脚本添加到KDE控制面板中的启动/关闭脚本中

为了快速手动执行:

  • 在应用程序启动器中添加一个条目(您也可以设置键盘快捷方式,例如“ CTRL + ALT + H”和/或将此启动器固定在窗口栏上)

剧本:

#!/bin/sh
device_mac='<your-devices-mac-address-here>'
pacmd set-card-profile `pacmd list-cards | grep bluez_card -B1 | grep index | awk '{print $2}'` off
sleep 2 
echo "disconnect $device_mac\n quit"|bluetoothctl
sleep 5
echo "connect $device_mac\n quit"|bluetoothctl
sleep 5
pacmd set-card-profile `pacmd list-cards | grep bluez_card -B1 | grep index | awk '{print $2}'` a2dp_sink

您应该将-e搭配使用echo
佳诺

3

在Xubuntu 16.04.2上,
使用blueman-manager:

  1. 连接->关闭配置文件
  2. 重新连接->设置配置文件A2DP
  3. 现在您的耳机没问题!

我的JBL bash脚本

#!/bin/bash
#headset mac
mac="00:1D:DF:67:0A:29"
profile="a2dp"
# Special Bluetooth controller, default is empty
btMac=""
#connect|disconnect wait time
waitTime=5

macId="${mac//:/_}"
deviceId="bluez_card.$macId"

declare -A profiles
profiles['a2dp']='a2dp_sink'
profiles['hsp']='headset_head_unit'
profiles['off']='off'

function btCmd() {
    cmd="$1\nquit"
    [ ! -z "$btMac" ] && cmd="select $btMac\n$cmd"
    echo -e "$cmd" | bluetoothctl
}
function setProfile() {
    cmd="pactl set-card-profile $deviceId ${profiles[$1]}"
    echo $cmd
    $cmd
}
function btWaitConnect() {
    conState=$1
    for ((i=1;i<=$waitTime;++i)); do
        tmp="`btCmd "info $mac"|grep 'Connected: '`"
        [ ! -z "`echo "$tmp"|grep $conState`" ] && echo "$tmp" && return 0
        sleep 1s
    done
    echo "$tmp"
    return 1
}
function btConnect() {
    tmp="`btCmd "trust $mac\nconnect $mac" | grep -v 'NEW\|DEL\| quit'`"
    echo "$tmp"

    tmp="`btWaitConnect yes`"
    echo $tmp
    [ -z "`echo "$tmp" | grep yes`" ] && echo -e "Device $mac:\n\tConnected: fail." && return 1
    sleep 2s
    return 0
}
function btDisConnect() {
    tmp="`btCmd "disconnect $mac" | grep -v 'NEW\|DEL\| quit'`"
    echo "$tmp"

    tmp="`btWaitConnect no`"
    echo $tmp
    [ -z "`echo "$tmp" | grep no`" ] && echo -e "Device $mac:\n\tdisconnected: fail." && return 1
    sleep 1s
    return 0    
}


# controller
echo ""
btCtls="`btCmd list | grep '^Controller' | grep " $btMac"`"
echo -e "controller:\n$btCtls"
[ -z "$btCtls" -o ! -z "`echo "$btCtls" | grep "not available"`" ] && exit 1


# connect -> set off
echo ""
tmp="`btCmd paired-devices | grep '^Device' | grep " $mac"`"
echo -e "paired-devices:\n$tmp"
[ `echo "$tmp" | wc -l` != 1 ] && echo "Please pair the Bluetooth headset first: $mac" && exit 1
btConnect || exit $?
setProfile off

# reconnect -> set profile
btDisConnect || exit $?
btConnect || exit $?
setProfile $profile

这个答案和@freespace帮助我完成了i3设置
Luis Lobo Borobia

最新的更新包含设置默认接收器,但是我不知道是否有必要。
佳诺

2

因此,如果您使用的是Debian,则可以执行以下操作: 拒绝将配置文件切换到a2dp_sink:未连接

问题

蓝牙耳机已连接,但ALSA / PulseAudio无法拾取连接的设备或没有设备可供拾取。发生这种情况是因为GDM在会话开始时捕获了A2DP接收器,因为GDM需要在gdm会话中使用pulseaudio以实现可访问性。例如,屏幕阅读器需要它。

为了防止GDM在会话启动时捕获A2DP接收器,请编辑/var/lib/gdm3/.config/pulse/client.conf(或创建它(如果不存在)):

autospawn = no
daemon-binary = /bin/true

之后,您必须向Debian-gdm用户授予对该文件的访问权限:

chown Debian-gdm:Debian-gdm /var/lib/gdm3/.config/pulse/client.conf

您还需要禁用pulseaudio启动:

rm /var/lib/gdm3/.config/systemd/user/sockets.target.wants/pulseaudio.socket

为了自动连接某些设备的a2dp,请将其添加到/etc/pulse/default.pa

load-module module-switch-on-connect

重启。


谢谢您,先生,您没有关注那些热衷于货运的人群,而是向您解释了这个问题!我可以确认这确实有助于Debian的发展。
Marcin Owsiany '18年

1

我确信先前的答案实际上试图解决问题的根本原因。但是,我无法让他们任何一个工作。我遇到了与OP完全相同的问题,但是在Linux Mint 17/18上。我写了这个剧本为了可靠地连接蓝牙并使用a2dp。

复制/粘贴以备后代使用,但最主要的是它可以精确地复制OP(和I)在UI中必须执行的操作。

Dominik的脚本无法可靠地为我工作,因为它只会尝试设置所有内容一次。我必须多次运行它才能正常工作。这就是我最终得到的,每次都有效。

#!/bin/bash

MAC=$1
CARD=$(echo "${MAC}" | sed -e 's/:/_/g')
CARD="bluez_card.${CARD}"

$(pactl list | grep -qi 'Active Profile: a2dp_sink')
a2dpUsed=$?

# this loops until a2dp is _actually used_ on the given MAC.
while [ ${a2dpUsed} -ne 0 ];
do
    #
    echo "Restarting bluetooth."
    rfkill unblock bluetooth
    sudo service bluetooth restart
    sudo hciconfig hci0 up

    # reconnect
    echo -e "power on\nconnect ${MAC}" | bluetoothctl

    #
    echo "Waiting for headset to be connected..."
    btConnected=1

    while [ ${btConnected} -gt 0 ];
    do

        sleep .1
        $(bluetoothctl <<< "info ${MAC}" | grep -qi "Connected: yes")
        btConnected=$?
    done

    #
    echo "Bluetooth connected, waiting for profiles to register"

    cardFound=1
    while [ ${cardFound} -ne 0 ];
    do
        $(pactl list | grep -qi "${CARD}")
        cardFound=$?
    done

    #
    echo "Setting bluetooth a2dp profile"
    pactl set-card-profile ${CARD} a2dp_sink
    $(pactl list | grep -qi 'Active Profile: a2dp_sink')
    a2dpUsed=$?
done

echo "a2dp is working."

1

如此处所述,这是因为GDM在会话开始时捕获了A2DP接收器,因为GDM需要在gdm会话中使用pulseaudio进行访问。
尝试将其添加到“ /var/lib/gdm3/.config/pulse/default.pa”,或创建它,然后重新启动:

#!/usr/bin/pulseaudio -nF
#

# load system wide configuration
.include /etc/pulse/default.pa

### unload driver modules for Bluetooth hardware
.ifexists module-bluetooth-policy.so
  unload-module module-bluetooth-policy
.endif

.ifexists module-bluetooth-discover.so
  unload-module module-bluetooth-discover
.endif

0

我试图设置我的蓝牙,但始终收到此错误。

我发现问题出在Skype。如果我正在运行Skype,则无法设置a2dp_sink配置文件。

因此,如果遇到此问题,请查看是否正在运行Skype并将其关闭。


0
systemctl restart bluetooth
  • 打开声音设置(通过单击托盘中的扬声器图标可访问)
  • 尝试将“输出”配置文件更改为“ A2DP接收器”。
  • 如果这不起作用,请将您的设备更改为Speakers或其他,然后再将其切换回。
  • 我通常会发现可以设置输出配置文件

0

我选择用udev规则解决它,因为我是系统的唯一用户,所以$USER$XAUTHORITY并且$DISPLAY是众所周知的。

对于希望在Ubuntu 18.04.1 LTS上运行的单个文件中定义解决方案的人来说,这可能很有用。

该挂钩是通过input子系统触发的,因为在此阶段扬声器似乎已完全初始化。

# file: /etc/udev/rules.d/99-jbl-go2.rules
# fix JBL GO2 with CSR bluetooth: switch to a2dp profile upon connect
# byteborg 20190110
SUBSYSTEMS=="input", ACTION=="add", ATTRS{name}=="70:99:1C:41:C6:EB", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/run/user/1000/gdm/Xauthority", RUN+="/bin/su alpha -c '/usr/bin/pacmd set-card-profile bluez_card.70_99_1C_41_C6_EB a2dp_sink'"

Archlinux Wiki提到在连接(https://wiki.archlinux.org/index.php/Bluetooth_headset#A2DP_sink_profile_is_unavailable)上提供错误配置文件的Cambridge Silicon Radio设备。我可以通过“ JBL GO 2”蓝牙扬声器来确认这种行为,就像之前提到的那样。连接后不久,a2dp似乎可以使用-也许是时间问题?


0

这为我解决了设置卡配置文件的问题:https : //bugs.launchpad.net/ubuntu/+source/pulseaudio/+bug/1181106/comments/15

引用:

1) Modify the /etc/bluetooth/audio.conf
================================

[General]
Enable = Source,Sink,Headset,Gateway,Control,Media
Disable = Socket

HFP=false

[A2DP]
SBCSources=1
MPEG12Sources=0

2) Check for pulseaudio module :
==========================

$ pactl list | grep -i module-bluetooth

If you dont have :
     module-bluetooth-policy
     module-bluetooth-discover
     module-bluetooth-device

Just do :
$ sudo apt-get install pulseaudio-module-bluetooth
$ pulseaudio -k
$ pactl load-module module-bluetooth-device
$ pactl load-module module-switch-on-connect

3) Connect the bluetooth headset
===========================

Use blueman to pair, and connect audio sink
Use pavucontrol to change for A2DP (even if blueman said "audio profile off")

Please confirm that works for you too.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.