ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于nRF5340与Zephyr RTOS的LE Audio广播音频硬件开发实战

基于nRF5340与Zephyr RTOS的LE Audio广播音频硬件开发实战 1. 项目缘起当蓝牙音频不再“独奏”如果你最近在折腾蓝牙音频项目或者对无线音频技术保持关注你大概率已经听过“LE Audio”这个词。它不再是纸上谈兵的标准而是正在悄然改变我们连接声音世界的方式。传统的蓝牙音频Classic Audio就像一场独奏一个主设备比如你的手机连接一个从设备比如你的耳机音流单向传输。而LE Audio特别是其核心的Auracast广播音频功能则像是一场交响乐广播一个音频源可以同时向无数个接收设备“广播”音频流让所有听众同步接收同一段旋律。我最近就在捣鼓一个基于这个理念的小玩意儿我把它叫做AuraPlug。它的核心目标很简单利用最新的LE Audio技术特别是Auracast制作一个硬件“音频插头”。这个插头一端接入任何传统的3.5mm音频源比如老式MP3播放器、电脑声卡、甚至黑胶唱机另一端则通过蓝牙5.2/5.3芯片将音频流以低功耗、高品质、可多设备同步接收的方式广播出去。想象一下在健身房、咖啡馆、小型会议室或者家庭聚会上你不再需要准备一堆有线耳机或者费力地配对多个蓝牙设备任何人只要带着支持LE Audio的耳机比如最新的高端TWS耳机就能像收听收音机一样轻松接入并同步收听你分享的音频而且延迟极低体验近乎无缝。这个项目的吸引力在于它站在了蓝牙音频技术演进的前沿。LE Audio带来的不仅是音质提升LC3编码更是连接模式的革命。而实现它的硬件核心我选择了Nordic Semiconductor的nRF5340这颗双核蓝牙5.3芯片并运行开源的Zephyr RTOS作为操作系统。整个开发过程就是一场与最新协议栈、实时操作系统和底层硬件驱动的深度对话。下面我就把从构思到实现的关键步骤、踩过的坑以及一些实用技巧毫无保留地分享出来。2. 核心硬件选型为什么是nRF5340和Zephyr做硬件项目选型是第一步也是最关键的一步它直接决定了项目的可行性、复杂度和最终性能。对于AuraPlug这样一个需要处理实时音频流、实现复杂蓝牙协议栈的项目主控芯片和软件平台的选择需要慎之又慎。2.1 芯片nRF5340不止于蓝牙市面上支持LE Audio的芯片方案正在增多但我最终锁定nRF5340是基于以下几个硬核考量协议栈完备性与前瞻性Nordic在蓝牙低功耗领域的积累有目共睹其nRF Connect SDK包含蓝牙协议栈对LE Audio和Auracast的支持是目前最成熟、最活跃的社区方案之一。这意味着在开发时我能获得相对完善的API和示例代码而不是从零开始啃协议规范。对于Auracast这种较新的特性芯片原厂的跟进速度至关重要。双核架构的天然优势nRF5340包含一个高性能应用内核Arm Cortex-M33 128 MHz和一个高能效网络内核Arm Cortex-M33 64 MHz。这种架构为音频应用提供了绝佳的舞台。我可以将蓝牙协议栈、射频控制等实时性要求高、与硬件紧密相关的任务放在网络核上运行确保无线连接的稳定和低延迟。同时将音频数据的采集、编码LC3、封装以及应用逻辑如状态指示、按键控制放在应用核上处理。双核之间通过IPC进程间通信高效协作从硬件层面避免了单核系统在处理音频和射频时可能出现的资源竞争和时序冲突问题。充足的资源与接口项目需要连接外部音频编解码器Codec或直接处理I2S数字音频流。nRF5340提供了丰富的数字音频接口I2S、PDM、I2C、SPI和足够的内存512KB RAM 1MB Flash能够轻松应对音频缓冲、协议栈运行和应用程序的需求。相比之下一些单核且内存较小的BLE芯片在运行完整的LE Audio协议栈外加音频处理时会非常吃力。开发生态与成本Nordic的nRF Connect SDK基于Zephyr RTOS拥有强大的开源社区和丰富的中间件支持。从长远看这降低了学习和维护成本。虽然nRF5340的单价可能比一些国产BLE芯片高但其带来的开发效率、系统稳定性和功能完整性对于原型验证和追求可靠性的产品来说价值远超芯片本身的价差。注意选择nRF5340也意味着你需要面对相对复杂的开发环境基于CMake的Zephyr和双核编程模型。这对于习惯了在Arduino或单一RTOS任务中编程的开发者来说有一个学习曲线。2.2 操作系统Zephyr RTOS为物联网而生的基石为什么不用简单的裸机程序或者FreeRTOS因为LE Audio协议栈本身就是一个复杂的状态机集合与硬件底层射频、时钟、电源耦合极深。Zephyr RTOS提供了几个不可替代的优势与芯片深度集成nRF Connect SDK中的蓝牙控制器Controller和主机Host协议栈是作为Zephyr的“子系统”原生集成的。这意味着协议栈的调度、中断处理、电源管理都与Zephyr的内核机制深度融合达到了最优的性能和能效。你很难通过移植的方式在别的RTOS上获得同样的稳定性和效率。设备驱动模型Zephyr提供了统一的设备驱动模型Device Driver Model。对于音频项目这意味着我可以像使用文件一样通过标准的API如audio_codec_read,i2s_write来操作外部的音频Codec芯片或I2S接口而无需关心底层是SPI还是I2C通信。驱动程序的编写和管理变得非常规范。强大的配置系统KconfigZephyr使用Kconfig进行系统功能裁剪这在大规模软件项目中是标配。通过menuconfig或修改prj.conf文件我可以精细地选择需要的蓝牙特性例如启用LE Audio 启用LC3编码器 设置广播参数、内核功能如任务栈大小、IPC缓冲区和硬件驱动生成最贴合项目需求的固件避免资源浪费。活跃的社区与持续更新作为Linux基金会旗下的项目Zephyr的更新非常活跃对新兴蓝牙规范的支持速度快。这对于跟踪LE Audio这种仍在演进的技术标准尤为重要。搭配组合的决策逻辑nRF5340 Zephyr这个组合本质上选择了一个“官方推荐”的完整解决方案。它牺牲了一点初期的简易性但换来了整个项目生命周期的可控性、可维护性和性能上限。对于想要深入理解现代无线音频系统开发的工程师来说这是一条“虽难但正确”的路。3. 开发环境搭建与第一个“Hello World”工欲善其事必先利其器。搭建nRF5340在Zephyr下的开发环境是项目的第一个实战环节。这个过程可能会遇到一些依赖问题但一旦完成后续的开发会顺畅很多。3.1 工具链安装避免版本地狱我强烈推荐使用nRF Connect for VS Code这个官方集成开发环境。它并非必须但它自动化处理了最令人头疼的依赖管理问题。如果你更喜欢命令行那么需要手动安装以下核心组件Zephyr SDK包含编译所需的交叉编译工具链GCC、CMake、Python脚本等。务必从Zephyr官网或Nordic的镜像下载并严格按照指南设置环境变量如ZEPHYR_SDK_INSTALL_DIR。nRF Connect SDK (NCS)这是Nordic在Zephyr基础上扩展的SDK包含了所有芯片特有的驱动、协议栈和示例。通过WestZephyr的多仓库管理工具来获取和管理。初始化命令类似于west init -m https://github.com/nrfconnect/sdk-nrf --mr main zephyrproject cd zephyrproject west update west zephyr-export这里--mr main指定使用主分支以获取最新的LE Audio支持。你也可以使用更稳定的版本标签如v2.6.0。Python依赖Zephyr的构建系统大量依赖Python。使用pip install -r zephyr/scripts/requirements.txt来安装所有必需的Python包。常见坑点务必使用Python 3.8或以上版本并在虚拟环境venv中操作避免与系统Python包冲突。实操心得无论用VS Code还是命令行第一次构建都可能因为网络问题下载工具链、Python包或路径设置错误而失败。建议预留充足时间并仔细阅读终端输出的错误信息。最常见的错误是CMake找不到工具链检查ZEPHYR_TOOLCHAIN_VARIANT和GNUARMEMB_TOOLCHAIN_PATH环境变量是否正确设置。3.2 从基础示例到音频广播循序渐进的验证环境搭好后不要直接冲击完整的AuraPlug。应该用开发板如nRF5340 DK分步验证。闪烁LEDBlinky编译并烧录zephyr/samples/basic/blinky到开发板。这验证了最基本的开发流程环境配置 - 代码编译 - 烧录 - 运行。成功看到LED闪烁说明工具链和硬件连接是通的。蓝牙广播Broadcaster编译运行zephyr/samples/bluetooth/broadcaster。这个例子让开发板作为一个最简单的蓝牙信标持续发送不可连接的广播数据。用手机上的蓝牙扫描工具如nRF ConnectApp应该能搜到这个设备。这一步验证了蓝牙射频部分的基本功能。LE Audio广播示例这是关键一步。在NCS中寻找LE Audio相关的示例。例如nrf/samples/bluetooth/目录下可能有broadcast_audio_sink接收端和broadcast_audio_source发送端的示例。先尝试编译和运行broadcast_audio_source。这个示例通常会用芯片内部生成的测试音频如正弦波或通过I2S接口读取板载麦克风的数据然后进行LC3编码最后通过LE Audio的广播模式发送出去。运行broadcast_audio_source时你需要一个接收端。最方便的接收端就是另一块运行了broadcast_audio_sink示例的nRF5340 DK或者某些已经支持LE Audio广播扫描的商用耳机需要确认其支持扫描并订阅公共广播。通过这个示例你可以验证整个LE Audio协议栈在板子上是否正常工作。听到测试音频如果是正弦波会是“嘀——”的蜂鸣声确认音频通路从编码到无线发送是通的。学习示例中如何配置广播参数、音频流参数和LC3编码器。这一步的常见问题编译错误很可能是因为某些LE Audio相关的Kconfig选项没有打开。你需要仔细检查示例目录下的prj.conf文件并确保在你的项目配置中包含了所有必要的配置例如CONFIG_BT_AUDIOy,CONFIG_BT_BAP_BROADCAST_SOURCEy,CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT1,CONFIG_BT_AUDIO_CODEC_LC3y等。没有声音检查开发板的音频输出配置。示例可能默认使用某个特定的I2S引脚或PWM输出你需要根据原理图确认这些引脚连接到了正确的音频放大器或编解码器上。有时需要额外配置设备树.overlay文件来启用正确的音频接口。4. AuraPlug核心实现从模拟音频到无线广播在成功运行官方示例后我们就可以开始定制AuraPlug的核心功能了。我们的目标是将一个外部的模拟音频信号来自3.5mm插孔接入系统经过数字化、编码再通过LE Audio广播出去。4.1 硬件电路设计信号链的起点AuraPlug的硬件核心除了nRF5340主控还需要一个关键的配角音频编解码器Audio Codec芯片。nRF5340虽然有I2S接口但它本身不包含模拟-数字转换器ADC。因此我们需要一颗Codec来完成“模拟音频信号 - 数字音频流I2S/PDM - 模拟音频信号”的转换。对于发送端AuraPlug我们只用到它的ADC功能。Codec选型考量接口优先选择支持I2S接口的Codec这是数字音频的标准接口与nRF5340对接最简单。供电电压最好能与nRF5340共用3.3V电源简化电源设计。封装与外围电路选择QFN或SSOP等易于手工焊接的封装且所需外围元件如滤波电容、晶振越少越好。驱动支持检查Zephyr是否已有该Codec的驱动或是否有相近型号的驱动可参考修改。这会节省大量底层调试时间。一个经典且易用的选择是TI的TLV320ADC3140或Cirrus Logic的CS5343。它们都是立体声ADC性能足够在开源硬件项目中很常见。以TLV320ADC3140为例你需要设计电路实现模拟输入3.5mm音频插座 - 适当的耦合电容和分压电路 - Codec的模拟输入引脚。数字接口Codec的I2S输出BCLK, LRCLK, DIN连接到nRF5340的I2S输入引脚I2C控制接口连接到nRF5340的I2C引脚用于配置Codec的工作模式采样率、增益等。时钟为Codec提供主时钟MCLK。这可以由nRF5340的GPIO生成也可以使用外部晶振。为了获得更好的音质和降低jitter建议使用外部低抖动晶振。避坑指南模拟音频电路非常容易引入噪声。布线时模拟地和数字地要在一点连接星型接地或使用磁珠/0欧电阻隔离。电源线要加宽并在Codec的电源引脚附近放置足够多的去耦电容如100nF和10uF并联。音频输入线要尽量短并远离数字信号线和高频时钟线。4.2 软件架构数据流的管道在Zephyr中整个音频处理流程可以看作一个数据流管道Pipeline。我们需要用Zephyr的音频框架Audio API来构建这个管道。初始化与配置I2C驱动初始化I2C设备用于配置TLV320ADC3140。你需要根据数据手册编写初始化序列寄存器配置设置采样率例如48kHz、位深24bit、输入增益等。I2S驱动初始化I2S设备配置为主模式接收Master Rx以接收来自Codec的I2S数据。需要匹配Codec的格式I2S标准格式时钟极性等。蓝牙音频配置通过Kconfig和运行时API配置LE Audio广播源的角色设置广播参数如广播间隔、广播数据并创建音频流struct bt_bap_stream。构建音频管道 Zephyr的音频框架提供了audio_codec和audio_dmic等设备类。我们需要为TLV320ADC3140编写或适配一个驱动使其注册为一个audio_codec设备。 然后在应用代码中管道的工作流程大致如下// 伪代码展示逻辑流程 void audio_pipeline_thread(void) { // 1. 获取音频Codec设备 const struct device *codec_dev device_get_binding(TLV320ADC3140); // 2. 配置Codec通过I2C audio_codec_configure(codec_dev, ...); // 3. 获取I2S设备 const struct device *i2s_dev device_get_binding(I2S_0); // 4. 配置I2S接收参数 i2s_configure(i2s_dev, I2S_DIR_RX, ...); // 5. 准备LC3编码器实例和缓冲区 struct lc3_encoder encoder; int16_t pcm_buffer[FRAME_SIZE]; uint8_t encoded_buffer[ENCODED_SIZE]; // 6. 启动蓝牙音频广播 bt_bap_broadcast_source_start(default_source, ...); while (1) { // 7. 从I2S读取一帧PCM数据 i2s_read(i2s_dev, pcm_buffer, sizeof(pcm_buffer)); // 8. LC3编码 lc3_encode(encoder, pcm_buffer, encoded_buffer, ...); // 9. 将编码后的数据发送到蓝牙音频流 bt_bap_stream_send(default_stream, encoded_buffer, encoded_size, ...); // 注意这里需要精确控制时序确保编码和发送的节奏与音频采样率匹配 // 否则会导致音频播放卡顿或加速。通常需要结合定时器或I2S的DMA中断来同步。 } }实际上在NCS的示例中这个管道可能被封装得更高级使用Zephyr的audio服务或特定的LE Audio流API。你需要仔细研究broadcast_audio_source示例看它是如何将I2S数据源与蓝牙音频流绑定起来的然后模仿这个结构将I2S数据源替换成你自己的Codec驱动。关键参数配置采样率与LC3帧LE Audio广播通常使用48kHz或32kHz采样率。LC3编码以“帧”为单位。例如48kHz下一个10ms的LC3帧包含480个采样点立体声则是480*2个。你的I2S读取缓冲区和LC3编码器的输入需要匹配这个帧大小。广播间隔与同步BT_LE_ADV_OPT_EXT_ADV和BT_LE_ADV_OPT_USE_IDENTITY等选项用于配置扩展广播。广播间隔如BT_GAP_ADV_FAST_INT_MIN_2会影响接收端发现的快慢和连接的稳定性。更关键的是定时广播Periodic Advertising它用于发送精确的时序信息让所有接收端能够同步解码音频流这是实现低延迟多设备同步收听的基础。在代码中需要正确配置BT_BAP_BROADCAST_SRC_SUBGROUP等结构体。4.3 功耗优化让插头更持久虽然AuraPlug通常由USB或电源适配器供电但作为低功耗蓝牙设备进行功耗优化仍是一个好习惯也能减少发热。CPU频率与电源模式nRF5340的应用核和网络核可以运行在不同频率。在音频编码和发送期间需要全速运行。但在空闲时比如没有音频输入时可以通过Zephyr的电源管理API让CPU进入空闲状态Idle甚至睡眠状态Sleep并动态调整频率。外设管理当没有音频流时可以关闭I2S、Codec和部分蓝牙无线电的供电。Zephyr的设备驱动模型支持pm_device_action_run(dev, PM_DEVICE_ACTION_SUSPEND)这样的操作来挂起设备。蓝牙广播功率通过bt_le_set_tx_power(BT_HCI_VS_LL_HANDLE_TYPE_ADV, tx_power)可以调整广播的发射功率。在信号覆盖良好的小范围内适当降低发射功率可以显著节省电量。编码复杂度LC3编码器有不同的复杂度等级。在保证基本音质的前提下可以选择较低复杂度的编码模式以减少CPU运算负载从而间接降低功耗。5. 调试与实战串口终端和蓝牙工具是你的眼睛开发此类嵌入式无线项目调试手段至关重要。你无法像在PC上一样轻松地设置断点和打印变量。5.1 日志输出串口终端是生命线Zephyr内置了强大的日志系统LOG_MODULE_REGISTER,LOG_INF,LOG_ERR等。默认情况下日志通过串口UART输出。你需要一个串口蓝牙终端或者USB转串口工具连接到开发板的调试串口。在VS Code中可以直接打开内置的串口终端选择正确的COM端口和波特率通常是115200。使用独立工具PuTTY、Tera Term、minicom或screen都是好选择。关键信息在代码的关键节点如初始化成功/失败、收到音频数据、开始广播、编码错误添加日志。这能帮你快速定位问题发生在哪个阶段。例如如果广播开始了但接收端没声音可以检查日志里LC3编码器是否在正常输出数据包。5.2 蓝牙协议分析nRF Connect for Desktop这是Nordic提供的免费神器包含多个工具其中最关键的是蓝牙嗅探器Bluetooth Sniffer。工作原理你需要一个nRF52840 Dongle或另一块nRF开发板作为嗅探器将其连接到电脑运行嗅探软件。它可以捕获空中的蓝牙数据包。调试广播用嗅探器捕获AuraPlug发出的广播包。你可以看到广播数据Advertising Data里是否包含了正确的LE Audio广播助理BIGInfo和音频流信息。如果接收端扫描不到很可能是广播数据格式不对或者广播参数如PHY设置有问题。调试音频流更高级的用法是解码同步广播Periodic Advertising和等时广播Isochronous Broadcasting信道上的数据。这能帮你确认音频数据是否真的被发送出去了以及数据包的时序是否正确。这对于排查音频卡顿、同步问题至关重要。5.3 接收端验证从开发板到真实耳机使用另一个nRF5340 DK作为接收端编译并烧录broadcast_audio_sink示例到另一块板子连接耳机或喇叭。这是最可控的调试环境。你可以同时观察发送端和接收端的日志对比数据流。使用支持Auracast的商用耳机这是最终的试金石。将耳机置于扫描广播模式不同耳机操作不同通常是在蓝牙设置里寻找“广播音频”或“共享音频”选项。如果AuraPlug配置正确耳机应该能发现一个可连接的音频广播源名称可能由你的代码设定。成功连接并收听意味着整个链路完全打通。多设备同步测试连接两个或更多支持LE Audio的接收设备播放音乐。仔细聆听它们之间的声音是否完全同步。如果出现可察觉的回声或延迟差可能需要检查广播源端的定时广播Periodic Advertising间隔是否稳定或者接收端的缓冲设置。5.4 常见问题排查清单问题接收端完全扫描不到广播。排查首先用手机蓝牙扫描非LE Audio模式看是否能发现一个普通的BLE设备。如果不能说明基础广播没起来。检查日志中蓝牙初始化是否成功 (bt_enable返回值)。广播参数是否合理bt_le_adv_start是否被调用。硬件天线部分是否正常电路、匹配。如果能扫描到普通BLE设备但耳机扫不到Auracast检查广播数据中是否包含了必要的LE Audio相关GAP数据BT_DATA_SVC_DATA16包含BASIG UUID等。使用nRF Connect App的“广播扫描器”功能可以详细解析广播包内容。问题能连接但没有声音。排查这是最复杂的情况需要分层排查。发送端日志检查I2S是否成功读取到数据打印一些采样值看看是否非零。检查LC3编码器是否被正确初始化并调用。蓝牙嗅探器确认同步广播和等时广播信道上有数据包在持续发送。接收端日志如果接收端也是自己开发的检查其是否成功解码LC3数据音频驱动如I2S是否正常输出。音频通路检查Codec的配置特别是MCLK、BCLK、LRCLK是否有时钟信号检查I2S连线检查最终输出端的放大器或耳机是否正常。问题声音卡顿、断断续续。排查这通常是实时性问题。CPU过载在日志中添加时间戳计算从I2S读取到蓝牙发送完成一个循环的时间。这个时间必须小于一个音频帧的长度如10ms。如果超时需要优化代码或者检查是否有高优先级中断打断了音频处理线程。缓冲区不足增加I2S DMA缓冲区大小或增加LC3编码输入/输出缓冲区。无线干扰尝试更换广播信道Channel Map或远离Wi-Fi路由器等2.4GHz干扰源。广播间隔不稳定确保定时广播的间隔interval设置合理并且系统时钟稳定。6. 超越基础功能扩展与优化思路当基本的音频广播功能稳定后AuraPlug可以进化得更加实用和智能。6.1 添加用户交互与控制一个裸奔的广播源并不好用。我们可以添加物理按键用于开关广播、切换频道修改广播标识符、调节音量通过修改LC3编码前的PCM数据增益或配置Codec输入增益。状态指示灯用LED指示当前状态如常亮-准备就绪慢闪-广播中快闪-错误。电池电量指示如采用电池供电通过ADC读取电池电压并通过蓝牙广播的BAS电池服务特性发送给接收端让用户在手机上能看到发射器的电量。在Zephyr中可以通过GPIO中断处理按键用PWM驱动LED用ADC读取电压并通过额外的BLE服务GATT Server来暴露这些状态和控制点。6.2 支持多音频源与混音目前的AuraPlug只有一个模拟输入。可以扩展为多路输入选择通过模拟开关芯片或数字MUX在多个3.5mm输入口之间切换。数字音频输入增加S/PDIF或TOSLINK光纤输入接口通过专用的接收芯片转换为I2S信号从而接入更高质量的数字音源。内部音源在nRF5340的Flash中存储一些提示音如开机铃声、频道切换提示音在特定事件时播放。这需要实现一个简单的音频文件解码器如WAV解码和一个混音器Mixer将内部音源与外部输入混合后再编码广播。Zephyr的音频框架可能包含混音器的组件或者需要自己实现一个简单的软件混音算法。6.3 网络化与高级应用通过nRF5340的另一个核心优势——其强大的应用核和丰富的内存可以为其添加网络功能。Wi-Fi协处理器通过SPI或UART连接一个ESP32-C3之类的低成本Wi-Fi芯片。让AuraPlug接入本地网络从而可以通过手机App或网页进行远程控制开关、音量、音源选择甚至接收来自网络的音频流如AirPlay Renderer, DLNA Renderer实现真正的无线音频网关。蓝牙MeshnRF5340也支持蓝牙Mesh。你可以将多个AuraPlug组成Mesh网络实现整个建筑内的音频广播分区控制或者同步播放创造沉浸式的背景音乐系统。6.4 产品化思考如果打算将AuraPlug从一个原型变为一个小批量产品还需要考虑外壳与电磁兼容EMC设计一个合适的塑料或金属外壳并做好屏蔽确保无线信号稳定且符合射频法规。认证蓝牙产品需要取得BQB蓝牙资格认证等相关无线电认证这是一个成本不低但必要的步骤。低功耗设计优化电源电路选择高效率的LDO或DC-DC芯片在待机时实现微安级的电流消耗。固件升级OTA通过蓝牙实现固件无线升级DFU功能这对于产品后期修复bug和增加功能至关重要。nRF Connect SDK提供了完善的蓝牙DFU示例可供参考。从一颗芯片的闪烁到一段声音在空气中同步传递给多个听众AuraPlug项目的实现过程是一次对现代嵌入式无线系统开发全栈能力的锻炼。它涉及硬件电路设计、实时操作系统编程、复杂的蓝牙协议栈应用以及音频信号处理。每一个环节的深入都会让你对“连接”二字有更具体的理解。当你终于听到清晰的音乐从多个耳机中同步传出时那种成就感远非购买一个现成产品所能比拟。这个项目最大的价值或许不在于做出了一个多么实用的工具而在于它为你打开了一扇门门后是即将到来的、由LE Audio定义的无线音频新世界。你可以基于这个核心去创造更多有趣的音频交互场景。
返回列表