Android 设备作为 A2DP 配置文件的接收器

Posted

技术标签:

【中文标题】Android 设备作为 A2DP 配置文件的接收器【英文标题】:Android device as a receiver for A2DP profile 【发布时间】:2015-03-02 01:26:03 【问题描述】:

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

【问题讨论】:

Receive audio via Bluetooth in Android的可能重复 【参考方案1】:

自 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/ 的提交消息中,您可以找到有关如何解决此问题的示例实现。

以下是这些更改的列表:

https://android-review.googlesource.com/#/c/97832/ https://android-review.googlesource.com/#/c/97853/ https://android-review.googlesource.com/#/c/97833/ https://android-review.googlesource.com/#/c/98130/ https://android-review.googlesource.com/#/c/98131/

【讨论】:

你知道Android 6是否启用了这个功能吗? 您发布的@nilo 补丁适用于android android-4.4_r1,在android L 中base 类(针对补丁)是不同的。例如:在文件platform/external/bluetooth/bluedroid / audio_a2dp_hw/audio_a2dp_hw.c 中已经有struct a2dp_stream_in *input; audio_a2dp_hw.c line 87 这也适用于 ESP32 IC 的 esp-idf,尽管我不知道接收器功能是否在堆栈的更高层中实现。【参考方案2】:

是的。有可能的。我在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 角色。

【讨论】:

您能否为此编写一些示例代码。我没有“相关领域的经验”,但我可以编译和编写应用程序。我会很感激您的反馈,甚至是下午。【参考方案3】:

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

【讨论】:

以上是关于Android 设备作为 A2DP 配置文件的接收器的主要内容,如果未能解决你的问题,请参考以下文章

在外部蓝牙设备和 Android 手机之间传输音频

在 Android 中通过蓝牙接收音频

安卓设备之间的蓝牙音频流

BlueZ 与 Bluedroid 蓝牙堆栈

如何断开A2DP配置文件蓝牙连接?

Android蓝牙连接a2dp蓝牙耳机