ESP Multi-Room Music 方案:支持音频实时同步播放 实现音乐互联共享

项目背景

随着无线通信技术的发展,针对不同音频应用领域的无线音频产品正不断涌现。近日,乐鑫科技推出了基于 Wi-Fi 的多扬声器互联共享音乐通信协议——ESP Multi-Room Music 方案。该方案使用乐鑫自研的基于 Wi-Fi 局域网的音频同步播放技术,支持音频设备间低延时自动校准,打造影院级立体声环绕系统。该方案具有以下优势:

  • 影院级立体声环绕系统: 可居家轻松构建影院级的立体声环绕系统,升级家庭影音系统,感受高质量的澎湃声音体验。
  • 低延时自校准:ESP Multi-Room Music 方案支持自动低延时校准,确保在不同位置的所有扬声器声音同步。
  • DIY 环绕效果:支持用户自定义多设备之间的组网以及环绕效果,可以根据用户的居家环境和喜好,实现对音箱智能 DIY 群组控制。
  • 多播放来源:支持来自媒资云端、手机设备、本地 AUX等输入方式,可随时随地构建设备协同播放场景。
  • 稳定性和可靠性:基于局域网 Wi-Fi 技术,提供稳定、可靠的音频数据传输,让用户的音频体验更加流畅
  • 易于安装和使用:无需复杂的设置过程,用户即可轻松安装和使用。同时摆脱繁琐的信号线缆,使空间更加整洁。

观看视频了解 ESP Multi-Room Music 方案。

ESP 音乐互联共享【超酷】

ESP Multi-Room Music 方案开源项目现已开源在 GitHub


项目价值

ESP Multi-Room Music 方案支持单个音箱的独立操作,在实现语音对话、音乐播放的同时,还能与其他预设群组音箱同步播放,并完成精确的实时校准同步,以实现立体环绕的音箱效果。这意味着,无论是个人消费类音响产品,还是专业商业音响产品,该方案都能为用户提供卓越的环绕体验和便利的使用体验。其低时延同步播放的特性该方案还能够被用于校园广播、居家检测报警、工厂流程化产品等应用中,为实时音频信息传递和设备实时共享提供关键支持。此外,ESP Multi-Room Music 方案还能 ESP RainMaker 云平台实现互联,在满足用户使用 APP 对音响进行 DIY 群组控制的同时,还能作为语音中枢记录环境中的其他智能产品。

综上所述,ESP Multi-Room Music 方案为音频互联共享提供了崭新和高效的解决方案,这将为用户、学生、家庭和企业带来更丰富、更便捷、更智能的音频体验!


开发指南

1. 环境配置

硬件要求本例程支持的开发板在 $ADF_PATH/examples/README_CN.md 文档例程与乐鑫音频开发板的兼容性表格中有标注表格中标有绿色复选框的开发板均可运行本例程。如下面的配置一节所述可以在 menuconfig 中选择开发板。

2. 编译和下载

使用 IDF 其他分支本例程支持 IDF release/v4.2 及以后的分支例程默认使用 IDF release/v4.4 分支

cd $IDF_PATH

git checkout master

git pull

git checkout release/v4.2

git submodule update --init --recursive

配置打开配置选项 idf.py menuconfig

在 menuconfig > Audio HAL 中选择合适的开发板。

在 Example Configuration > WiFi SSID  WiFi Password 配置 Wi-Fi 网络。

编译和下载:请先编译版本并烧录到开发板上,然后运行 monitor 工具来查看串口输出 (替换 PORT 为端口名称):

idf.py -p PORT flash monitor

退出调试界面使用 Ctrl-]。

有关配置和使用 ESP-IDF 生成项目的完整步骤,请参阅《ESP-IDF 编程指南》

3. 如何使用例程

功能和用法:

  • 准备三块及以上乐鑫音频开发板(例如 ESP32-S3-Krovo-2 或者 ESP32-LyraT-Mini),同时在所有开发板上加载并运行示例。
  • 当所有开发板都处于从机开始搜索模式后,按下其中一块开发板的 PLAY/REC 键开始 (ESP) Multi-Room Music 播放。

日志输出:

  • 从机开始搜索,打印如下:
I (5451) ESP_AUDIO_TASK: media_ctrl_task running...,0x3f805a60



----------------------------- ESP Audio Platform -----------------------------

|                                                                            |

|                 ESP_AUDIO-v1.6.6-10-gf944a6b-aca0d7f-2d83f7a               |

|                     Compile date: Mar 15 2021-11:14:21                     |

------------------------------------------------------------------------------

I (5492) ESP_AUDIO_CTRL: Func:media_ctrl_create, Line:342, MEM Total:4338832 Bytes, Inter:220956 Bytes, Dram:205124 Bytes



I (5504) AUDIO_HAL: Codec mode is 3, Ctrl:1

I (5510) MRM_EXAMPLE: [ 3 ] Create and start input key service

I (5516) ESP_DECODER: esp_decoder_init, stack size is 30720

I (5522) I2S: DMA Malloc info, datalen=blocksize=1200, dma_buf_count=3

I (5545) I2S: APLL: Req RATE: 48000, real rate: 47999.961, BITS: 16, CLKM: 1, BCK_M: 8, MCLK: 12287990.000, SCLK: 1535998.750000, diva: 1, divb: 0

I (5549) ESP_AUDIO_CTRL: Enter play procedure, src:0

I (5554) ESP_AUDIO_CTRL: Play procedure, URL is ok, src:0

I (5560) ESP_AUDIO_CTRL: Request_CMD_Queue CMD:0, Available:5, que:0x3ffd5320

I (5568) ESP_AUDIO_TASK: It's a decoder

I (5572) ESP_AUDIO_TASK: 1.CUR IN:[IN_raw],CODEC:[DEC_auto],RESAMPLE:[48000],OUT:[OUT_iis],rate:0,ch:0,pos:0

I (5583) ESP_AUDIO_TASK: 2.Handles,IN:0x3f806fd0,CODEC:0x3f807254,FILTER:0x3f8075b8,OUT:0x3f807414

I (5592) ESP_AUDIO_TASK: 2.2 Update all pipeline

I (5597) ESP_AUDIO_TASK: 2.3 Linked new pipeline

I (5603) AUDIO_PIPELINE: link el->rb, el:0x3f806fd0, tag:IN_raw, rb:0x3f807758

I (5611) AUDIO_PIPELINE: link el->rb, el:0x3f807254, tag:DEC_auto, rb:0x3f809f98

I (5619) AUDIO_PIPELINE: link el->rb, el:0x3f8075b8, tag:Resample, rb:0x3f80bfd8

I (5627) ESP_AUDIO_TASK: 3. Previous starting...

I (5632) AUDIO_ELEMENT: [IN_raw-0x3f806fd0] Element task created

I (5639) AUDIO_THREAD: The DEC_auto task allocate stack on external memory

I (5648) AUDIO_ELEMENT: [DEC_auto-0x3f807254] Element task created

I (5653) AUDIO_ELEMENT: [DEC_auto] AEL_MSG_CMD_RESUME,state:1

I (5660) ESP_AUDIO_TASK: No Blocking play with decoder

I (5665) ESP_AUDIO_TASK: Recv Element[IN_raw-0x3f806fd0] MSG,type:20000,cmd:8,len:4,status:AEL_STATUS_STATE_RUNNING

I (5677) ESP_AUDIO_TASK: Recv Element[IN_raw-0x3f806fd0] MSG,type:20000,cmd:8,len:4,status:AEL_STATUS_STATE_RUNNING

I (5688) ESP_DECODER: Ready to do audio type check, pos:0, (line 104)

I (5695) ESP_AUDIO_CTRL: Func:_ctrl_play, Line:763, MEM Total:4267572 Bytes, Inter:206344 Bytes, Dram:190512 Bytes



I (5706) ESP_AUDIO_CTRL: Exit play procedure, ret:0

W (5714) MRM_MULTICAST: creat addr 239.255.255.252 port 1900

I (5718) AUDIO_THREAD: The mrm_slave_client task allocate stack on external memory

I (5726) MRM_CLIENT: Slave start searching...
  • 主机开始播放,打印如下:
I (56177) MRM_EXAMPLE: [ * ] [Play] input key event

I (56734) MRM_CLIENT: slave client task stoped

I (56735) AUDIO_THREAD: The mrm_master_client task allocate stack on external memory

I (58324) HTTP_STREAM: total_bytes=2994349

I (58325) AUDIO_ELEMENT: [http-0x3f805e44] Element task created

I (58325) AUDIO_THREAD: The multi_room_play task allocate stack on external memory

I (58334) ESP_DECODER: Detect audio type is MP3

I (58338) MP3_DECODER: MP3 opened

I (58342) ADF_BIT_STREAM: The element is 0x3f807254. The reserve data 2 is 0x0.

I (58353) ESP_AUDIO_TASK: Recv Element[DEC_auto-0x3f807254] MSG,type:20000,cmd:8,len:4,status:AEL_STATUS_STATE_RUNNING

I (58367) ESP_AUDIO_TASK: Received music info then on play

I (58368) ESP_AUDIO_TASK: On event play, status:UNKNOWN, 0

I (58374) AUDIO_THREAD: The Resample task allocate stack on external memory

I (58382) AUDIO_ELEMENT: [Resample-0x3f8075b8] Element task created

I (58391) AUDIO_ELEMENT: [Resample] AEL_MSG_CMD_RESUME,state:1

I (58395) AUDIO_ELEMENT: [OUT_iis-0x3f807414] Element task created

I (58402) AUDIO_ELEMENT: [OUT_iis] AEL_MSG_CMD_RESUME,state:1

I (58408) I2S_STREAM: AUDIO_STREAM_WRITER

I (58413) ESP_AUDIO_TASK: Recv Element[OUT_iis-0x3f807414] MSG,type:20000,cmd:8,len:4,status:AEL_STATUS_STATE_RUNNING

I (58567) RSP_FILTER: sample rate of source data : 44100, channel of source data : 2, sample rate of destination data : 2

I (58571) ESP_AUDIO_TASK: Recv Element[Resample-0x3f8075b8] MSG,type:20000,cmd:8,len:4,status:AEL_STATUS_STATE_RUNNING

I (58583) ESP_AUDIO_TASK: ESP_AUDIO status is AEL_STATUS_STATE_RUNNING, 0, src:0, is_stopping:0

I (58592) ESP_AUDIO_TASK: Func:media_ctrl_task, Line:860, MEM Total:4169352 Bytes, Inter:155804 Bytes, Dram:139972 Bytes



I (59139) MRM_CLIENT: ===== Send Sync =====

Version:ESP32 MRM/1.0

Tag:SYNC_PTS

TSF:5784716

Sync:533



I (59543) MRM_CLIENT: ===== Send Sync =====

Version:ESP32 MRM/1.0

Tag:SYNC_PTS

TSF:5785121

Sync:938



I (59947) MRM_CLIENT: ===== Send Sync =====

Version:ESP32 MRM/1.0

Tag:SYNC_PTS

TSF:5785525

Sync:1344



I (60350) MRM_CLIENT: ===== Send Sync =====

Version:ESP32 MRM/1.0

Tag:SYNC_PTS

TSF:5785929

Sync:1749
  • 从机开始播放,打印如下:
I (59095) MRM_EXAMPLE: slave set url https://dl.espressif.com/dl/audio/ff-16b-2c-44100hz.mp3

I (60563) HTTP_STREAM: total_bytes=2994349

I (60563) AUDIO_ELEMENT: [http-0x3f805e44] Element task created

W (60563) AUIDO_MEM: Can't support stack on external memory due to ESP32 chip is 1

I (60573) ESP_DECODER: Detect audio type is MP3

I (60577) MP3_DECODER: MP3 opened

I (60581) ADF_BIT_STREAM: The element is 0x3f806250. The reserve data 2 is 0x0.

I (60592) ESP_AUDIO_TASK: Recv Element[DEC_auto-0x3f806250] MSG,type:20000,cmd:8,len:4,status:AEL_STATUS_STATE_RUNNING

I (60607) ESP_AUDIO_TASK: Received music info then on play

I (60608) ESP_AUDIO_TASK: On event play, status:UNKNOWN, 0

W (60613) AUIDO_MEM: Can't support stack on external memory due to ESP32 chip is 1

I (60621) AUDIO_ELEMENT: [Resample-0x3f8065b4] Element task created

I (60629) AUDIO_ELEMENT: [Resample] AEL_MSG_CMD_RESUME,state:1

I (60634) AUDIO_ELEMENT: [OUT_iis-0x3f806410] Element task created

I (60641) AUDIO_ELEMENT: [OUT_iis] AEL_MSG_CMD_RESUME,state:1

I (60647) I2S_STREAM: AUDIO_STREAM_WRITER

I (60653) ESP_AUDIO_TASK: Recv Element[OUT_iis-0x3f806410] MSG,type:20000,cmd:8,len:4,status:AEL_STATUS_STATE_RUNNING

I (60800) RSP_FILTER: sample rate of source data : 44100, channel of source data : 2, sample rate of destination data : 2

I (60804) ESP_AUDIO_TASK: Recv Element[Resample-0x3f8065b4] MSG,type:20000,cmd:8,len:4,status:AEL_STATUS_STATE_RUNNING

I (60815) ESP_AUDIO_TASK: ESP_AUDIO status is AEL_STATUS_STATE_RUNNING, 0, src:0, is_stopping:0

I (60824) ESP_AUDIO_TASK: Func:media_ctrl_task, Line:860, MEM Total:4167400 Bytes, Inter:108288 Bytes, Dram:92456 Bytes



I (61554) MRM_EXAMPLE: slave got sync 601

I (61554) MRM_CLIENT: [sync] Sync 601 PTS 714 E2E_delay [68] sync diff [-13] ms

I (61964) MRM_EXAMPLE: slave got sync 1011

I (61965) MRM_CLIENT: [sync] Sync 1011 PTS 1024 E2E_delay [73] sync diff [-3] ms

相关资源

  • 项目 Github 链接
  • 项目 README 文档_CN
  • 例程与乐鑫音频开发板的兼容性表格
  • 乐鑫物联网开发框架 ESP-IDF
  • 乐鑫 ESP RainMaker SDK

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/196469.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM框架的合同服务管理系统设计与实现

基于SSM框架的合同服务管理系统的设计与实现 摘要:当今社会,各行各业都离不开计算机软件的推广,销售,运营各方面,有些中小型企业没有技术与能力开发和维护一款软件来运营,这时催生很多软件外包公司的产生。…

【Electron】上下键切换消息

需求: 如图,需要监听上下键切换消息 Electron 注册 全局快捷键【globalShortcut】监听 在focus注册 在blur 注销 如苹果系统在使用某个软件(focus)时 右上角会有应用标题 Electron 代码: win.on(focus, ()>{globalShortcut.register(U…

建筑木模板厂家批发

在建筑施工中,木模板是一种常见且重要的施工材料,用于搭建混凝土浇筑的支撑结构。选择合适的建筑木模板厂家进行批发,对于施工质量和效率至关重要。本文将介绍建筑木模板厂家批发的重要性,并推荐贵港市能强优品木业作为专业的建筑…

【数据结构复习之路】树和二叉树(严蔚敏版)万字详解主打基础

专栏:数据结构复习之路 复习完上面四章【线性表】【栈和队列】【串】【数组和广义表】,我们接着复习 树和二叉树,这篇文章我写的非常详细且通俗易懂,看完保证会带给你不一样的收获。如果对你有帮助,看在我这么辛苦整理…

阿里云语雀频繁崩溃,有什么文档管理工具是比较稳定的?

10月23 日14:00左右,蚂蚁集团旗下的在线文档编辑与协同工具语雀发生服务器故障,在线文档和官网都无法打开。直到当天晚上22:24,语雀服务才全部恢复正常。从故障发生到完全恢复正常,语雀整个宕机时间将近 8 小时,如此长…

深度学习毕设项目 基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python

文章目录 1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理 3 DeOldify 框架4 First Order Motion Model 1 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求&am…

PS最新磨皮软件Portraiture4.1.2

Portraiture是一款好用的PS磨皮滤镜插件,拥有磨皮美白的功能,操作也很简单,一键点击即可实现美白效果,软件还保留了人物的皮肤质感让照片看起来更加真实。portraiture体积小巧,不会占用过多的电脑内存哦。 内置了多种…

交流负载测试使用场景

交流负载测试是一种在特定环境下,对电力设备、汽车电子部件,工业自动化设备、网络设备、家电产品,航空航天设备以及医疗器械等产品进行测试的方法,该测试的目的是评估这些设备在实际运行条件下的性能和可靠性。 1电力设备测试 交…

基于SSM实现的叮当书城

一、系统架构 前端:jsp | jquery | layui 后端:spring | springmvc | mybatis 环境:jdk1.7以上 | mysql | maven 二、代码与数据库 三、功能介绍 01. 系统首页 02. 商品分类 03. 热销 04. 新品 05. 注册 06. 登录 07. 购物车 08. 后台-首页 …

HTTP协议,Web框架回顾

HTTP 请求协议详情 -请求首行---》请求方式,请求地址,请求协议版本 -请求头---》key:value形式 -referer:上一次访问的地址 -user-agenet:客户端类型 -name:lqz -cookie&…

c语言,输入整数n(行数,本例为4),按照如下规则打印数字图片 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16

c语言&#xff0c;输入整数n(行数&#xff0c;本例为4&#xff09;&#xff0c;按照如下规则打印数字图片 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 以下是使用C语言编写的程序&#xff0c;根据输入的行数打印数字图片的规则&#xff1a; #include <stdio.h>int main() …

lack——主页前后端开发优化(精华:java多线程实现数据插入)

lack——主页前后端开发优化 前端开发主页 最容易的方式&#xff1a;list列表<template><van-cardv-for"user in props.userList":desc"user.profile":title"${user.username} (${user.planetCode})":thumb"user.avatarUrl"…

静态方法和属性的经典使用-单例设计模式

单例设计模式 一、设计模式二、单例模式1、饿汉式2、懒汉式3、区别 单例设计模式是静态方法和属性的经典使用。 一、设计模式 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱&#xff0c;不同的棋局&…

基于隐马尔可夫模型的一种流水印

文章信息 论文题目&#xff1a;An Invisible Flow Watermarking for Traffic Tracking: A Hidden Markov Model Approach 期刊&#xff08;会议&#xff09;&#xff1a;ICC 2019 - 2019 IEEE International Conference on Communications (ICC) 时间&#xff1a;2019 级别&am…

linux调用github代码文件

一&#xff0c;建库 默认建好库 默认linux已安装好git 二&#xff0c;生成SSH公钥 1&#xff0c;选这 2进教程&#xff0c;看怎么生成公钥的 根据下图教程&#xff0c;得到key&#xff0c;添加到github中&#xff01;具体教程&#xff0c;进github看 三。调用 gitssh链…

深度学习实战61-基于知识图谱与BiLSTM网络实现疾病相关智能问答系统,并支持数据扩展

大家好,我是微学AI,今天给大家介绍一下深度学习实战61-深度学习在医疗领域的应用:疾病相关智能问答系统,并支持数据扩展。本文将详细介绍如何使用Py2neo这个Python库来构建一个医疗领域知识图谱,并将数据导入Neo4j图数据库。我们将提供一些医疗领域的数据样例,并展示如何…

解决electron-build打包后运行app报错:cannot find module xxx

现象&#xff1a; 关于这个问题查了很多资料&#xff0c;也问了chatgpt都没有找到答案。 最后只能靠自己了。 于是冷静下来回想一下细节。突然发现了一个特别点。 eletron-builder打包时&#xff0c;强制要求eletron-builder和eletron必须都放在devDependencies 否则&#…

Spring的创建

文章目录 前言 一、创建一个Maven项目 二、添加spring框架支持 2.1在项目的pom.xml添加spring框架支持&#xff0c;xml配置如下  2.2添加包 总结 前言 我们通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源框架&a…

Win10电脑用U盘重装系统的步骤

在Win10电脑中&#xff0c;用户遇到了无法解决的系统问题&#xff0c;用户这时候就可以考虑重装Win10系统&#xff0c;这样即可轻松解决问题&#xff0c;从而满足自己的操作需求。接下来小编给大家详细介绍关于Win10电脑中用U盘重装系统的教程步骤。 准备工作 1. 一台正常联网可…

户外园林气象环境RTU采集主机监测的具体使用

户外园林是人们休闲、娱乐和放松心情的场所&#xff0c;良好的气象环境对于提供舒适的户外体验至关重要。为了有效监测和管理园林的气象环境&#xff0c;户外园林气象环境RTU&#xff08;Remote Terminal Unit&#xff09;采集主机应运而生。本文将详细介绍户外园林气象环境RTU…