14

基本上,我现在要做的是使用安卓设备作为 A2DP 接收器,当配对建立时,安卓播放从发射器接收到的声音。我担心如果我使用 STP 配置文件,可能会导致流媒体延迟。所以,我想使用 A2DP,但这可以使用 android 设备作为 A2DP 的接收器吗?怎么做?

4

3 回答 3

17

由于 Android L,BlueDriod 堆栈确实支持 A2DP 接收器,但默认情况下它是禁用的。

要启用它,请执行以下操作:

/* Enable bluetooth av sink. */
#define BTA_AV_SINK_INCLUDED TRUE

/external/bluetooth/bluedroid/include/bt_target.h中。这启用了蓝牙堆栈中的接收器支持。

你也必须做这个改变:

<!-- Enable sink support. -->
<bool name="profile_supported_a2dp_sink">true</bool>

/packages/apps/Bluetooth/res/values/config.xml。这将启用特定的 UI。

现在您可以配对您的设备并开始流式传输。不幸的是,尽管您会收到数据包,但您不会听到任何声音。原因是 A2DP sink 没有音频路由。在此补丁https://android-review.googlesource.com/#/c/98161/的提交消息中,您可以找到有关如何解决此问题的示例实现。

以下是这些更改的列表:

于 2015-07-16T15:51:26.137 回答
5

是的。有可能的。我在JB做过。Android 在内部使用 Broadcomm 的“Bluedroid”堆栈进行蓝牙。以前,此堆栈不支持 A2DP 接收器角色(您提到的接收器)。从 Lollipop 版本开始,Bluedroid 中添加了 A2DP Sink 角色配置文件。但是,它不能被框架/上层(应用程序)使用。您需要对框架进行更改以启用它或“使用”它。您可以参考Android源代码中的以下文件和相关文件来启用它。

audio.h - put a new audio source
audio_policy.conf - put a new input source for a2dp 'inputs'
AudioManager.java
AudioPolicyManagerBase.cpp
AudioService.java
AudioSystem.java
BluetoothA2dp.java
MediaRecorder.java
A2DPStateMachine.java

等并实现它(这个文件列表并不全面,但如果你有相关领域的经验,你可以弄清楚)。建立任何流连接后,您将在 a2dp 状态机中获得回调,并且您必须从那里启动一个线程以从“新”音频源读取解码的 PCM 字节并将其发送到您的媒体播放器。SBC 编解码器到 PCM 解码将在“bluedroid”sbc 解码器层完成。

构建它并将其闪存到您的手机并享受音乐。

编辑:此外,您可能在 Bluedroid 堆栈中更改了 A2DP SDP 记录以宣传 A2DP Sink 角色。

于 2015-03-06T05:38:05.203 回答
2

您可能无法在两部手机之间手动执行此操作,因为要流式传输一个设备需要是 A2DP 接收器和其他其他 A2DP 源,电话通常只是源设备(可以流式传输到接收器设备的流的源),接收器是耳机或蓝牙扬声器。

于 2017-12-05T10:33:25.510 回答