我可以将我的计算机用作 A2DP 接收器/蓝牙扬声器吗?

Pie*_*ier 45 bluetooth

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

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

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

sla*_*sek 54

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

Ubuntu(10.04 及更高版本)中的bluez包包含一个名为sdptool的实用程序,可用于检查蓝牙设备是否配置为 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

$
Run Code Online (Sandbox Code Playgroud)

这是在我的本地 Ubuntu 机器上运行时的输出:

$ sdptool search --bdaddr local a2snk
Searching for a2snk on FF:FF:FF:00:00:00 ...
$
Run Code Online (Sandbox Code Playgroud)

这表明 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
Run Code Online (Sandbox Code Playgroud)

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

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

  Enable=Source
Run Code Online (Sandbox Code Playgroud)

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

进行此更改后,您将需要通过运行来重新启动 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

 pactl load-module module-loopback
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

 pactl load-module module-loopback source_dont_move=yes source=$BTSOURCE sink=$SINK
Run Code Online (Sandbox Code Playgroud)

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

  • 你可以找到$SINKpactl list sinks,它的后出Name:
  • 同样你可以看到$BTSOURCEpactl 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
Run Code Online (Sandbox Code Playgroud)

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

pactl unload-module $(pactl list short modules | grep "loopback.*$BTSOURCE" | cut -f1)
Run Code Online (Sandbox Code Playgroud)

同样,替换$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
Run Code Online (Sandbox Code Playgroud)

参考:

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


小智 13

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

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


dgh*_*son 7

现在在 Ubuntu 12.04 中真的很简单

连接您的蓝牙设备

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

pactl list sources 
Run Code Online (Sandbox Code Playgroud)

为蓝牙设备做一个环回:

pactl load-module module-loopback source=$SOURCE_NUMBER  
Run Code Online (Sandbox Code Playgroud)

其中 $SOURCE_NUMBER 是您之前记下的数字。

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

$ pactl load-module module-loopback source=3  
Run Code Online (Sandbox Code Playgroud)

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

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

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

pactl list short modules
Run Code Online (Sandbox Code Playgroud)

移除环回设备:

pactl unload-module $MODULE_NUMBER
Run Code Online (Sandbox Code Playgroud)

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

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

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