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

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

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

网上有关a2dp的一些资源,但大多数都已过时:

  • http://fosswire.com/post/2008/10/better-bluetooth-audio/
  • http://jprvita.wordpress.com/2009/12/15/1-2-3-4-a2dp-stream/
  • http://dpillay.wordpress.com/2010/09/27/ubuntu-10-04-a2dp-awesome-headset-music/

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

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 $ 

这是我对本地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]部分下添加此行来启用/etc/bluetooth/audio.conf器支持:

  Enable=Source 

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

进行此更改后,您将需要通过运行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可能包含模块蓝牙策略,它可能已经为您设置了一个环回设备,但这似乎不是最常见的情况。

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

  pactl load-module module-loopback 

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

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

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

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

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

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

  • 您可以找到带有pactl list sinks $SINK ,它显示在Name:之后Name:
  • 同样,您可以看到带有pactl list sources$BTSOURCE
  • 当蓝牙设备断开连接时, source_dont_move参数可防止环回连接回退到另一个音频源。 它被删除了,你下次必须重新设置它。

这是一个示例的例子(请记住在蓝牙地址中替换: with _ !):

 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 

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

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

再次,将$BTSOURCE替换$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中修复此问题的一些细节。

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

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

现在在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发布之前编写的,所以我确信会有一些变化。 例如,我没有必须手动启用蓝牙设备作为音频源(默认情况下已启用)。 但是,我有时必须在手机上的蓝牙设置中切换“媒体音频”配置文件(Samsung Captivate运行CyanogenMod 9.1.0)。

有可能通过使用shell脚本来监视蓝牙A2DP设备连接并自动为其加载环回模块来利用dbus-monitor,但这有点过头了。

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

对于13.04,将您的源设备与ubuntu笔记本电脑配对,它就可以了! 非常酷,发现它现在很容易。

在Ubuntu 16.04中,这是开箱即用的。

比答案更容易解决方案。

你可以去吧

 sudo apt-get install pulseaudio* 

然后重启。 重启后,连接到蓝牙,只需在手机上播放音乐即可。 一切都将传输到您的计算机并在计算机的扬声器上播放。

是的! 别客气。