使用bluez堆栈,是否可以连接多个音频源?如何 ?如果不行的话可以通过其他方式吗?如果可能的话,是否可以将不同的蓝牙版本(例如低功耗)与旧版本混合使用?
如果不可能,我认为(昂贵的)解决方案是在我的(物理)音频混音器后面插入多个(物理)蓝牙接收器^-^
背景:我正在尝试构建一个“媒体服务器”,并且我希望手机能够将音频流式传输到它,但我不想听到“请,您可以断开[实际上没有播放音乐]手机的连接吗?我可以连接我的”。
答案1
我也想将多个蓝牙设备连接到一个音频流,在我的情况下是下沉。
在上面答案的刺激下,我开始研究pulseaudio代码,以获得更多的见解,也许还可以升级它来做我想做的事情。
我在中发现了这个https://cgit.freedesktop.org/pulseaudio/pulseaudio/tree/src/modules/bluetooth/bluez5-util.c:
/* Currently only one A2DP codec is supported, so register only SBC * Support for multiple codecs needs to use a new Bluez API which * pulseaudio does not implement yet, patches are waiting in queue */ a2dp_codec_sbc = pa_bluetooth_get_a2dp_codec("sbc");
这是在树顶代码中,因此似乎有人正在考虑升级 puseaudio 以在某个时候更好地匹配 Bluez5 API。
在此 diff 中还提示需要恢复哪些代码: https://cgit.freedesktop.org/pulseaudio/pulseaudio/commit/?id=d504744396316c4b05f477327feb36095f5e68cb
答案2
有报道称这应该是可能的,特别是主要开发人员的邮件列表回复指出可以通过audio.conf来完成。但这个文件不再随 BlueZ 5 一起提供,并且当前的源代码没有引用它曾经包含的部分(例如“[A2DP]”或“[Headset]”)。
如果您运行的是 Bluez 4,这可能很有用。maemo 论坛上的这篇文章(我相信,maemo 是 Linux 中蓝牙音频工作的主要赞助商)显示了一个示例 audio.conf 文件,其中SourceCount
选项设置为 2。这个 AskUbuntu 答案表示您必须将SBCSources
,MPEG12Sources
和MaxConnected
设置为大于 1 的数字。
使用 BlueZ 5 和 Pulseaudio,当我尝试连接第二个源时,它会立即断开连接。使用hcidump
,我可以看到由接收音频的设备发送的这个数据包全部出了问题:
< ACL data: handle 62 flags 0x00 dlen 10
L2CAP(d): cid 0x0042 len 6 [psm 25]
AVDTP(s): Discover rsp: transaction 0 nsp 0x00
ACP SEID 1 - Audio Source
ACP SEID 2 - Audio Sink (InUse)
请注意水槽是如何标记为正在使用。看到这个之后,源就断开了。
很难说这个配置选项去了哪里,BlueZ 因其稀疏的文档而臭名昭著。在 BlueZ 5 中,大部分音频职责已转移到其他程序中,例如 Pulseaudio。它们通过 DBus 进行通信,Pulseaudio 向 BlueZ 注册端点。也许Pulseaudio应该注册多个端点,但在pulseaudio-module-bluetooth-discover中似乎没有关于多个源的任何选项。
答案3
可能有点晚了,但几年前我曾尝试过这个并且让它工作了一段时间,所以我将在这里分享我的经验。
Pulseaudio 2.x 是允许多个蓝牙音频流作为音频源出现在 PA 中的最后一个版本。从 PA 3.0 开始,他们将音频处理更改为其中之一(我不太清楚)
1) 仅处理一对 BT 音频源/接收器,或者
2) 允许每个(本地)音频设备有一对 BT 音频源/接收器
PA 2.x 当时正在与 Bluez4 一起工作。我不知道是否仍然可以使用 Bluez5 注册多个音频接收器,但至少 PA 并没有使它变得容易甚至不可能。就像 @philippe 在另一个答案中所说,如果 PA 将接收器视为 InUse,它将断开音频流(即使从技术上讲,音频流不需要连接到 PA 接收器)
PS:虽然它实际上有效,但两个蓝牙设备的音频流确实会在无线电级别上产生干扰,因此不要指望混合 2 个完美的音频流,其中一个或两个都会遇到数据包丢失的情况。