我可以将我的电脑用作 A2DP 接收器/蓝牙扬声器吗?

我可以将我的电脑用作 A2DP 接收器/蓝牙扬声器吗?

首先,问题是:我使用 Cowon MP3 播放器作为主要音乐播放器,并配有基本的耳塞。

它提供 A2DP,我希望我的上网本(运行 UNE 10.04)充当接收器。

网络上有一些关于 a2dp 的资源,但大多数已经过时了:

答案1

要将您的 Ubuntu 机器用作 a2dp 蓝牙设备,您必须首先将其配置为注册为“a2dp 接收器”端点。

布鲁兹Ubuntu(10.04 及以上版本)中的软件包包含一个名为sdp工具可用于检查蓝牙设备是否配置为 a2dp 接收器。以下是针对我的蓝牙耳机运行 sdptool 的输出(地址取自 gnome-control-center 中的“蓝牙设置”对话框):

$ sdptool search --bdaddr 00:18:16:3A:3B:D4 a2snk
Searching for a2snk on 00:18:16:3A:3B:D4 ...
Service RecHandle: 0x10002
Service Class ID List:
  "Audio Sink" (0x110b)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 25
  "AVDTP" (0x0019)
    uint16: 0x102
Profile Descriptor List:
  "Advanced Audio" (0x110d)
    Version: 0x0102

$

以下是在我本地的 Ubuntu 机器上运行的输出:

$ sdptool search --bdaddr local a2snk
Searching for a2snk on FF:FF:FF:00:00:00 ...
$

这表明 Ubuntu 机器没有将自己宣传为 a2dp 接收器。但它将自己宣传为 a2dp 源:

$ sdptool search --bdaddr local a2src
Searching for a2src on FF:FF:FF:00:00:00 ...
Service Name: Audio Source
Service RecHandle: 0x10003
Service Class ID List:
  "Audio Source" (0x110a)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 25
  "AVDTP" (0x0019)
    uint16: 0x102
Profile Descriptor List:
  "Advanced Audio" (0x110d)
    Version: 0x0102

这使得 Ubuntu 机器能够正确与耳机配对作为音频源,但不允许使用 Ubuntu 机器作为蓝牙音频的输出(接收器)。

如果您编辑/etc/bluetooth/audio.conf,您可以通过在该[General]部分下方添加此行来启用 a2dp 接收器支持:

  Enable=Source

这个名字违反直觉——因为我们在这里添加的是蓝牙接收器支持,而不是源支持——并且与此文件中声称所有实现的服务都默认启用的注释相矛盾。:(

完成此更改后,您需要通过运行重新启动 bluetoothd sudo service bluetooth restart

如果您在尝试完成此工作时之前已将您的 Android 设备和 Ubuntu 计算机配对,则您需要删除双方的配对并重新配对,以便让 Android 将 Ubuntu 识别为可用的音频设备。

完成此操作后,Android 设备应显示为 PulseAudio 下的输入设备。如果 PulseAudio 未检测到新的蓝牙音频源,您可能需要从命令行安装并加载蓝牙模块:

 sudo apt-get install pulseaudio-module-bluetooth
 pactl load-module module-bluetooth-discover

然后,您需要告诉 PulseAudio 使用环回连接(从源到接收器的直线)将此音频输入路由到您的输出/接收器(例如扬声器或蓝牙耳机)。

PulseAudio 的后续版本可能包含 module-bluetooth-policy,并且可能已经为您设置了环回设备,但这似乎不是最常见的情况。

半自动化方式要设置环回连接(如果您还安装了 pavucontrol GUI 程序),只需加载环回模块并使用 pavucontrol 进行配置,因为 PulseAudio 会记住这些设置。使用 pactl 命令加载模块:

 pactl load-module module-loopback

如果您还没有听到任何声音,或者您得到了奇怪的反馈效果,请不要担心,我们需要告诉新创建的设备从哪个源获取输入以及首先将输出发送到哪个接收器。

打开 pavucontrol 并打开其配置选项卡。确保您的蓝牙设备显示在此处(使用 blueman-manager 或其他蓝牙工具与其配对后),并且配置文件设置为 A2DP。切换到输入设备选项卡,确保您的设备也显示在此处且未静音。现在切换到录制选项卡,并使用静音按钮旁边的选择框让新创建的环回连接使用您的设备作为源。切换到播放选项卡以相同方式选择环回连接应使用的接收器。如果环回设备未显示在选项卡中,请确保使用每个选项卡底部的选择框显示所有流。

现在,您应该可以在扬声器或您选择的任何输出接收器中听到设备发出的音频(如果正在播放)。当您的设备断开连接时,环回设备将回退到可用的接收器和源,这可能不是理想的选择,因此请确保将环回设备静音,直到您需要它为止。由于 module-*-restore 模块的存在,下次连接同一蓝牙设备时,环回连接将恢复相同的接收器/源。

如果这不起作用或者您没有安装 pavucontrol,您可以改用以下方法设置环回:

 pactl load-module module-loopback source_dont_move=yes source=$BTSOURCE sink=$SINK

(将其替换$BTSOURCE为 PulseAudio 所见的蓝牙设备的源名称,例如bluez_source.14_DA_E9_2A_D7_57;并将其替换$SINK为您想要将音频流发送到的 PulseAudio 输出的名称,例如:alsa_output.pci-0000_00_1b.0.analog-stereo。您可以完全省略接收器参数并让其回退到活动接收器,然后通过 pavucontrol 进行更改。)

  • 你可以$SINK用找到pactl list sinks,它显示在Name:
  • $BTSOURCE类似地,你可以看到pactl list sources
  • source_dont_move参数可防止蓝牙设备断开连接时环回连接回退到其他音频源。相反,它会被删除,下次您必须重新设置它。

下面是一个示例(请记住在蓝牙地址中替换:为!):_

pactl load-module module-loopback source_dont_move=yes source=bluez_source.14_DA_E9_2A_D7_57 sink=alsa_output.pci-0000_00_14.2.analog-stereo

如果加载 fallback 模块失败,请尝试删除该source_dont_move=yes参数,该参数在版本 1.0 中首次可用。然后,在删除此音频之前,请务必小心删除此环回连接,否则,如果您的笔记本电脑麦克风未静音,您可能会收到一些非常糟糕的反馈。要在完成后手动删除此环回连接,请运行:

pactl unload-module $(pactl list short modules | grep "loopback.*$BTSOURCE" | cut -f1)

再次,将其替换$BTSOURCE为指代您的蓝牙设备的 PulseAudio 源的名称。您也可以使用 load-module 命令返回的 id 卸载模块:

$ pactl load-module module-loopback source_dont_move=yes source=bluez_source.14_DA_E9_2A_D7_57 sink=alsa_output.pci-0000_00_14.2.analog-stereo
15
$ pactl unload-module 15

参考:

  • 博客文章概述了如何在 Ubuntu 中修复此问题的一些细节。

答案2

我使用 blueman,从 Ubuntu 软件中心安装。右键单击 blueman 图标*->“本地服务”->音频->选中“高级音频接收”提示。顺便说一句,我使用它在我的 Ubuntu 11.10 笔记本电脑上收听我在安卓手机上播放的内容。

*blueman图标显示在gnome shell + ubuntu 11.10的右下角,这是我的情况。希望这对你有用。

答案3

在 Ubuntu 12.04 中现在非常简单

连接蓝牙设备

搜索您的蓝牙设备并记下它的源号码:

pactl list sources 

为蓝牙设备创建环回:

pactl load-module module-loopback source=$SOURCE_NUMBER  

其中 $SOURCE_NUMBER 是您之前记下的号码。

例如,我输入以下内容以使音频播放正常工作:

$ pactl load-module module-loopback source=3  

就是这样!我发现顶部答案中的解决方案有点复杂,所以我以这种方式简化它(大大减少了打字和复制/粘贴)。不过,如果您删除蓝牙设备之前列出的任何音频设备,我的解决方案可能会失效pactl list sources

另外,在断开蓝牙设备之前,不要忘记移除环回模块:

记下您创建的环回设备的模块编号:

pactl list short modules

删除环回设备:

pactl unload-module $MODULE_NUMBER

之前的回答都是在 12.04 发布之前写的,所以我确信有一些变化。例如,我不需要手动启用使用蓝牙设备作为音频源(默认情况下已启用)。但是,我有时必须在手机的蓝牙设置中切换“媒体音频”配置文件(运行 CyanogenMod 9.1.0 的三星 Captivate)。

可能有一种方法可以利用 dbus-monitor,即使用 shell 脚本来监视蓝牙 A2DP 设备连接并自动为其加载环回模块,但这有点超出我的理解范围。

希望我们不再需要在 Ubuntu 12.10 中手动执行此操作。

答案4

在 Ubuntu 16.04 中,此功能开箱即用。

相关内容