Android NDK开发详解连接性之蓝牙低功耗音频

注意 :如果设备支持 BLE 音频,则 isLeAudioSupported() 和 isLeAudioBroadcastSourceSupported() 将返回 True。

蓝牙低功耗音频 (LEA) 可确保用户能在不牺牲电池续航时间的情况下获得高保真音频,并可让用户在不同的使用情形之间无缝切换。Android 13(API 级别 33)包含对 LEA 的内置支持。

大多数 LEA 头戴设备将采用双模式,直到 LEA 源设备市场份额增加。用户应该能够在其双模式耳机上配对和设置这两种传输方式。

用例

您可以针对以下用例集成 LEA:

共享音频:用户可以同时与一个或多个音频接收设备共享多个音频流。音频会在源设备和已连接的设备之间同步。

广播音频:用户可向亲朋好友广播音频,也可连接到公共广播以获取信息、娱乐或无障碍用途。

LC3 音频编解码器支持:这是默认的音频编解码器,取代了 HFP(语音)中用于 A2DP(媒体)和 mSBC 的 SBC 编解码器。LC3 更高效、可重配置且质量更高。

改进了音频采样:使用麦克风时,耳机可以保持较高的输出音频质量。传统蓝牙会在使用蓝牙麦克风时降低音频质量。使用 BLE 音频时,输入和输出采样频率可以达到 32 kHz。

立体声麦克风:耳穿戴设备可以使用立体声麦克风录制音频,增强空间音频效果。

助听器配置文件 (HAP) 支持:与以前的 ASHA 协议相比,HAP 可为用户提供更好的无障碍功能和使用体验。用户可以使用助听器进行通话和 VoIP 应用。

增强属性协议 (EATT) 支持:EATT 允许开发者同时向配对的听觉设备发送多个命令。

主要场景

用例主要有四类:

对话型:需要低延迟通信路由的拨号器和 VoIP 应用可提供高质量的音频,并且耗电量更少。

游戏:借助并发麦克风和高保真播放功能,游戏可以将高品质音频流式传输到耳穿戴设备。当游戏开启蓝牙麦克风,可供使用时,游戏应用可以使用 BLE 音频输入。然后,当玩家开始与同伴玩家进行实时对话时,游戏应用可以立即使用麦克风数据。

媒体:允许媒体应用设置音频管理器的首选设备。用户可以通过在系统的设置中更改首选设备来覆盖此设置。

无障碍功能:支持 BLE 音频的助听器现在可以使用麦克风,以便用户持续使用助听器进行通话。

BLE 音频 API 和方法

如需支持 BLE 音频耳穿戴设备,需要使用以下 API 和方法:

音频管理器

setCommunicationDevice() 选择应用于通信使用情形(例如语音通话或视频通话)的音频设备。语音或视频聊天应用可以使用此方法选择其他音频设备,而不是平台默认选择的音频设备。此 API 取代了以下已废弃的 API:startBluetoothSco()、stopBluetoothSco() 和 setSpeakerphoneOn()。
clearCommunicationDevice 会在您的应用完成通话或会话后调用,以确保用户在不同应用之间切换时获得良好的体验。

BluetoothProfile

BluetoothLeAudio 通过代理对象控制蓝牙服务。

电信通话服务

setAudioRoute() 用于设置音频路由到当前活跃设备。
CallAudioState.ROUTE_BLUETOOTH 通过蓝牙定向音频流。
requestBluetoothAudio() 请求将音频路由到特定蓝牙设备。

音频设备信息

AudioDeviceInfo.TYPE_BLE_HEADSET 将音频设备类型描述为 LEA 设备。用于识别可听设备是否为 LEA 设备。

录音器

setPreferredDevice() 用于设置音频路由要使用的首选设备。用户可以在系统设置中覆盖此设置。

蓝牙适配器

如果平台的硬件支持 LEA,则返回 isLeAudioSupported()。
如果平台的硬件支持 LEA,则返回 isLeAudioBroadcastSourceSupported()。

基于用例的指南

以下是根据具体用例实现 LEA 的指南。

语音通信应用

语音通信应用可以选择通过自行管理其状态或使用 Telecom API(可为您执行音频路由和状态逻辑)来管理音频路由和设备状态。

自行管理:对于目前使用 startBluetoothSco()、stopBluetoothSco() 和 setSpeakerphoneOn() 的应用,或者希望自行管理音频路由状态的应用,请遵循音频管理器自行管理的通话指南。

托管:使用 Telecom API 创建音频或视频通话应用。 借助此 API,您可以快速轻松地控制音频路由以及在蓝牙设备之间切换。如需了解详情,请参阅电信管理的通话指南。

录音应用

媒体录制器:使用媒体录制器录制音频时,如果蓝牙耳机支持 LEA,则您可以进行立体声录制。请参阅录音指南。

LE 音频 (LEA) 耳机建议

随着越来越多的 LEA 耳机的发布,我们在实际测试中发现了一些会降低用户体验的问题。本规范并未涵盖所有这些问题。下表列出了 LEA 耳机制造商在改善 Android 用户的端到端体验时应遵循的建议。
在这里插入图片描述

上下文类型支持

在这里插入图片描述

注意 :根据规范,耳机可以随时从可用上下文类型中移除上下文类型,并移除所有已连接的设备,甚至是正在流式传输给定上下文类型的设备。建议耳机不要从流式传输该上下文类型的设备上的可用上下文类型中移除当前流式传输的上下文类型。

本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。

最后更新时间 (UTC):2023-10-26。

ble audio补丁原理是利用hidraw节点捕捉协议栈发送的语音数据,目前Android Blueroid将ble语音数据和按键信息通过hid发送出去,通过建立hidraw节点,可以从中捕捉到语音数据。目前通过ble hal实现从hidraw中读取遥控器语音数据,在Android框架层上就通过配置文件将ble hal导入到音频框架中,并通过绑定Android原生已有的耳麦设备来完成audio音频策略选择,通过apk检测ble连接状态,通知audio服务耳麦设备的状态就可以使得录音通路切换至ble hal,实现从ble获取录音数据功能。 打补丁前最好使用干净的环境,不要有别家方案ble补丁,否则可能会有不兼容问题。 补丁如若不能使用首先检查节点是否存在和其权限,正常节点权限如下: ls -l /dev/hidraw* crw-rw---- 1 system audio 241, 0 2018-12-18 13:42 /dev/hidraw0 audio用户组有读写权限。 2、如果selinux模式为Enforcing,可以通过logcat搜索avc关键字。有如下类似提示则为异常,提示进程没有权限,检查sepolicy是否设置正常: avc: denied { read } for name="/" dev="tmpfs" ino=6145 scontext=u:r:mediaserver:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0 //Android 5.0和6.0版本,audio hal被mediaserver进程加载 avc: denied { read } for name="/" dev="tmpfs" ino=8125 scontext=u:r:audioserver:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0 //Android 7.0版本,audio hal被audioserver进程加载 avc: denied { read } for name="hidraw" dev="sysfs" ino=16332 scontext=u:r:hal_audio_default:s0 tcontext=u:object_r:sysfs:s0 tclass=dir permissive=0 //Android 8.0和9.0版本,audio hal被android.hardware.audio@2.0-service进程加载 3、检查audio的配置,打上patch后,首先确认小机上文件是否有修改到,目前文件可能位于/vendor/etc或/system/etc目录下,其中/vendor/etc下的配置文件是优先解析的。确保文件无误后,通过dumpsys media.audio_policy查看ble hal是否正常加载。 以下是相关说明: AudioPolicyManager: 0xf20c5200 Command Thread: 0xf20af140 Tones Thread: 0xf20af020 ... - Available input devices: Device 1: - id: 3 - type: AUDIO_DEVICE_IN_BUILTIN_MIC - Profiles: Profile 0: - format: AUDIO_FORMAT_PCM_16_BIT - sampling rates:8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 - channel masks:0x000c, 0x0010 Device 2: - id: 20 - type: AUDIO_DEVICE_IN_WIRED_HEADSET //对应的数值是0x80000010 - name: RemoteDM1204 - Profiles: Available input devices指示当前可用设备,目前ble hal是和AUDIO_DEVICE_IN_WIRED_HEADSET设备绑定,如果需要录音走ble hal,AUDIO_DEVICE_IN_WIRED_HEADSET设备必须出现在可用设备中,如果没有,就可能是补丁中hidaudio.apk的问题。 HW Modules dump: ... - H
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值