基本上,我现在要做的是使用安卓设备作为 A2DP 接收器,当配对建立时,安卓播放从发射器接收到的声音。我担心如果我使用 STP 配置文件,可能会导致流媒体延迟。所以,我想使用 A2DP,但这可以使用 android 设备作为 A2DP 的接收器吗?怎么做?
3 回答
由于 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/的提交消息中,您可以找到有关如何解决此问题的示例实现。
以下是这些更改的列表:
是的。有可能的。我在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 角色。
您可能无法在两部手机之间手动执行此操作,因为要流式传输一个设备需要是 A2DP 接收器和其他其他 A2DP 源,电话通常只是源设备(可以流式传输到接收器设备的流的源),接收器是耳机或蓝牙扬声器。