当前位置: 首页 > news >正文

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_PATHgit checkout mastergit pullgit checkout release/v4.2git 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 BytesI (5504) AUDIO_HAL: Codec mode is 3, Ctrl:1I (5510) MRM_EXAMPLE: [ 3 ] Create and start input key serviceI (5516) ESP_DECODER: esp_decoder_init, stack size is 30720I (5522) I2S: DMA Malloc info, datalen=blocksize=1200, dma_buf_count=3I (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: 0I (5549) ESP_AUDIO_CTRL: Enter play procedure, src:0I (5554) ESP_AUDIO_CTRL: Play procedure, URL is ok, src:0I (5560) ESP_AUDIO_CTRL: Request_CMD_Queue CMD:0, Available:5, que:0x3ffd5320I (5568) ESP_AUDIO_TASK: It's a decoderI (5572) ESP_AUDIO_TASK: 1.CUR IN:[IN_raw],CODEC:[DEC_auto],RESAMPLE:[48000],OUT:[OUT_iis],rate:0,ch:0,pos:0I (5583) ESP_AUDIO_TASK: 2.Handles,IN:0x3f806fd0,CODEC:0x3f807254,FILTER:0x3f8075b8,OUT:0x3f807414I (5592) ESP_AUDIO_TASK: 2.2 Update all pipelineI (5597) ESP_AUDIO_TASK: 2.3 Linked new pipelineI (5603) AUDIO_PIPELINE: link el->rb, el:0x3f806fd0, tag:IN_raw, rb:0x3f807758I (5611) AUDIO_PIPELINE: link el->rb, el:0x3f807254, tag:DEC_auto, rb:0x3f809f98I (5619) AUDIO_PIPELINE: link el->rb, el:0x3f8075b8, tag:Resample, rb:0x3f80bfd8I (5627) ESP_AUDIO_TASK: 3. Previous starting...I (5632) AUDIO_ELEMENT: [IN_raw-0x3f806fd0] Element task createdI (5639) AUDIO_THREAD: The DEC_auto task allocate stack on external memoryI (5648) AUDIO_ELEMENT: [DEC_auto-0x3f807254] Element task createdI (5653) AUDIO_ELEMENT: [DEC_auto] AEL_MSG_CMD_RESUME,state:1I (5660) ESP_AUDIO_TASK: No Blocking play with decoderI (5665) ESP_AUDIO_TASK: Recv Element[IN_raw-0x3f806fd0] MSG,type:20000,cmd:8,len:4,status:AEL_STATUS_STATE_RUNNINGI (5677) ESP_AUDIO_TASK: Recv Element[IN_raw-0x3f806fd0] MSG,type:20000,cmd:8,len:4,status:AEL_STATUS_STATE_RUNNINGI (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 BytesI (5706) ESP_AUDIO_CTRL: Exit play procedure, ret:0W (5714) MRM_MULTICAST: creat addr 239.255.255.252 port 1900I (5718) AUDIO_THREAD: The mrm_slave_client task allocate stack on external memoryI (5726) MRM_CLIENT: Slave start searching...
  • 主机开始播放,打印如下:
I (56177) MRM_EXAMPLE: [ * ] [Play] input key eventI (56734) MRM_CLIENT: slave client task stopedI (56735) AUDIO_THREAD: The mrm_master_client task allocate stack on external memoryI (58324) HTTP_STREAM: total_bytes=2994349I (58325) AUDIO_ELEMENT: [http-0x3f805e44] Element task createdI (58325) AUDIO_THREAD: The multi_room_play task allocate stack on external memoryI (58334) ESP_DECODER: Detect audio type is MP3I (58338) MP3_DECODER: MP3 openedI (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_RUNNINGI (58367) ESP_AUDIO_TASK: Received music info then on playI (58368) ESP_AUDIO_TASK: On event play, status:UNKNOWN, 0I (58374) AUDIO_THREAD: The Resample task allocate stack on external memoryI (58382) AUDIO_ELEMENT: [Resample-0x3f8075b8] Element task createdI (58391) AUDIO_ELEMENT: [Resample] AEL_MSG_CMD_RESUME,state:1I (58395) AUDIO_ELEMENT: [OUT_iis-0x3f807414] Element task createdI (58402) AUDIO_ELEMENT: [OUT_iis] AEL_MSG_CMD_RESUME,state:1I (58408) I2S_STREAM: AUDIO_STREAM_WRITERI (58413) ESP_AUDIO_TASK: Recv Element[OUT_iis-0x3f807414] MSG,type:20000,cmd:8,len:4,status:AEL_STATUS_STATE_RUNNINGI (58567) RSP_FILTER: sample rate of source data : 44100, channel of source data : 2, sample rate of destination data : 2I (58571) ESP_AUDIO_TASK: Recv Element[Resample-0x3f8075b8] MSG,type:20000,cmd:8,len:4,status:AEL_STATUS_STATE_RUNNINGI (58583) ESP_AUDIO_TASK: ESP_AUDIO status is AEL_STATUS_STATE_RUNNING, 0, src:0, is_stopping:0I (58592) ESP_AUDIO_TASK: Func:media_ctrl_task, Line:860, MEM Total:4169352 Bytes, Inter:155804 Bytes, Dram:139972 BytesI (59139) MRM_CLIENT: ===== Send Sync =====Version:ESP32 MRM/1.0Tag:SYNC_PTSTSF:5784716Sync:533I (59543) MRM_CLIENT: ===== Send Sync =====Version:ESP32 MRM/1.0Tag:SYNC_PTSTSF:5785121Sync:938I (59947) MRM_CLIENT: ===== Send Sync =====Version:ESP32 MRM/1.0Tag:SYNC_PTSTSF:5785525Sync:1344I (60350) MRM_CLIENT: ===== Send Sync =====Version:ESP32 MRM/1.0Tag:SYNC_PTSTSF:5785929Sync:1749
  • 从机开始播放,打印如下:
I (59095) MRM_EXAMPLE: slave set url https://dl.espressif.com/dl/audio/ff-16b-2c-44100hz.mp3I (60563) HTTP_STREAM: total_bytes=2994349I (60563) AUDIO_ELEMENT: [http-0x3f805e44] Element task createdW (60563) AUIDO_MEM: Can't support stack on external memory due to ESP32 chip is 1I (60573) ESP_DECODER: Detect audio type is MP3I (60577) MP3_DECODER: MP3 openedI (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_RUNNINGI (60607) ESP_AUDIO_TASK: Received music info then on playI (60608) ESP_AUDIO_TASK: On event play, status:UNKNOWN, 0W (60613) AUIDO_MEM: Can't support stack on external memory due to ESP32 chip is 1I (60621) AUDIO_ELEMENT: [Resample-0x3f8065b4] Element task createdI (60629) AUDIO_ELEMENT: [Resample] AEL_MSG_CMD_RESUME,state:1I (60634) AUDIO_ELEMENT: [OUT_iis-0x3f806410] Element task createdI (60641) AUDIO_ELEMENT: [OUT_iis] AEL_MSG_CMD_RESUME,state:1I (60647) I2S_STREAM: AUDIO_STREAM_WRITERI (60653) ESP_AUDIO_TASK: Recv Element[OUT_iis-0x3f806410] MSG,type:20000,cmd:8,len:4,status:AEL_STATUS_STATE_RUNNINGI (60800) RSP_FILTER: sample rate of source data : 44100, channel of source data : 2, sample rate of destination data : 2I (60804) ESP_AUDIO_TASK: Recv Element[Resample-0x3f8065b4] MSG,type:20000,cmd:8,len:4,status:AEL_STATUS_STATE_RUNNINGI (60815) ESP_AUDIO_TASK: ESP_AUDIO status is AEL_STATUS_STATE_RUNNING, 0, src:0, is_stopping:0I (60824) ESP_AUDIO_TASK: Func:media_ctrl_task, Line:860, MEM Total:4167400 Bytes, Inter:108288 Bytes, Dram:92456 BytesI (61554) MRM_EXAMPLE: slave got sync 601I (61554) MRM_CLIENT: [sync] Sync 601 PTS 714 E2E_delay [68] sync diff [-13] msI (61964) MRM_EXAMPLE: slave got sync 1011I (61965) MRM_CLIENT: [sync] Sync 1011 PTS 1024 E2E_delay [73] sync diff [-3] ms

相关资源

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

相关文章:

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

项目背景 随着无线通信技术的发展,针对不同音频应用领域的无线音频产品正不断涌现。近日,乐鑫科技推出了基于 Wi-Fi 的多扬声器互联共享音乐通信协议——ESP Multi-Room Music 方案。该方案使用乐鑫自研的基于 Wi-Fi 局域网的音频同步播放技术&#xff…...

java分布式锁分布式锁

java分布式&锁&分布式锁 锁 锁的作用:有限资源的情况下,控制同一时间段,只有某些线程(用户/服务器)能访问到资源。 锁在java中的实现: synchronized关键字并发包的类 缺点:只对单个的…...

2. 流程控制|方法|数组|二维数组|递归

文章目录 流程控制代码块选择结构循环结构跳转控制关键字 方法方法的概述方法的重载Junit单元测试初识全限定类名 Debug 小技巧数组数组的基本概念数组的基本使用数组的声明数组的初始化 JVM内存模型什么是引用数据类型基本数据类型和引用数据类型的区别堆和栈中内容的区别 数组…...

22. 自动装配有哪些限制(需要注意)?

自动装配有哪些限制(需要注意)&#xff1f; 一定要声明set方法覆盖&#xff1a; 你仍可以用 < constructor-arg >和 < property > 配置来定义依赖&#xff0c;这些配置将始终覆盖自动注入。基本数据类型&#xff1a;不能自动装配简单的属性&#xff0c;如基本数据…...

14 网关实战:网关聚合API文档

上节课介绍了网关层的认证鉴权,今天这节介绍一下网关层如何聚合API接口文文档。 为什么需要聚合API接口文档? 大型微服务系统模块众多,木谷博客系统就有9个,如果这些服务的接口地址没有一个统一,那么客户端将要保存每个服务的接口地址,这个肯定是不现实。 先来看一下A…...

css 固定按钮到页面顶部或者底部的实现方式

实现方式 要将按钮固定到顶部或底部&#xff0c;可以使用CSS的定位属性来实现。下面是一种常用的方法&#xff1a; 创建一个包含按钮的HTML元素&#xff0c;例如一个<div>元素。确保给它添加一个唯一的id&#xff0c;以便在CSS中进行定位。 <div id"myButton&qu…...

【Java Spring】SpringBoot常用插件

文章目录 1、Lombok1.1 IDEA社区版安装Lombok1.2 IDEA专业版安装Lombok1.3 Lombok的基本使用 2、EditStarters2.1 IDEA安装EditStarters2.2 EditStarters基本使用方法 1、Lombok 是简化Java开发的一个必要工具&#xff0c;lombok的原理是编译过程中将lombok的注解给去掉并翻译…...

GPT还远远不是真正的智能

GPT是一个基于深度学习的自然语言处理模型&#xff0c;它可以生成逼真的文本。虽然GPT在生成文本方面取得了显著的进展&#xff0c;但它并不具备真正的智能。GPT是通过训练模型来学习语言模式&#xff0c;它不具备理解、推理、判断和主动学习的能力。它只是根据已有的语料库生成…...

计算机网络:网络层

0 本节主要内容 问题描述 解决思路 1 问题描述 两大问题&#xff08;重点&#xff0c;也是难点&#xff09;&#xff1a; 地址管理&#xff1b;路由选择。 1.1 子问题1&#xff1a;地址管理 网络上的这些主机和节点都需要使用一种规则来区分&#xff0c;就相当于是一种身…...

消息队列进阶-1.消息队列的应用场景与选型

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44…...

浅谈堆和栈内存以及编程语言

浅谈堆和栈内存以及编程语言 栈和堆C 和 C# 的区别&#xff1a;C#总结 编程语言C汇编语言&#xff08;Assembly Language&#xff09;&#xff1a;机器语言&#xff08;Machine Language&#xff09;&#xff1a; 拓展C#依赖注入&#xff08;Dependency Injection&#xff09;模…...

SpringBootWeb案例_01

Web后端开发_04 SpringBootWeb案例_01 原型展示 成品展示 准备工作 需求&环境搭建 需求说明&#xff1a; 完成tlias智能学习辅助系统的部门管理&#xff0c;员工管理 环境搭建 准备数据库表&#xff08;dept、emp&#xff09;创建springboot工程&#xff0c;引入对应…...

C语言数据结构-----栈和队列练习题(分析+代码)

前言 前面的博客写了如何实现栈和队列&#xff0c;下来我们来看一下队列和栈的相关习题。 链接: 栈和队列的实现 文章目录 前言1.用栈实现括号匹配2.用队列实现栈3.用栈实现队列4.设计循环队列 1.用栈实现括号匹配 此题最重要的就是数量匹配和顺序匹配。 用栈可以完美的做到…...

uniapp基础-教程之HBuilderX配置篇-01

uniapp教程之HBuilderX配置篇-01 为什么要做这个教程的梳理&#xff0c;主要用于自己学习和总结&#xff0c;利于增加自己的积累和记忆。首先下载HBuilderX&#xff0c;并保证你的软件在C盘进行运行&#xff0c;最好使用英文或者拼音&#xff0c;这个操作是为了保证软件的稳定…...

【备忘录】快速回忆ElasticSearch的CRUD

导引——第一条ElasticSearch语句 测试分词器 POST /_analyze {"text":"黑马程序员学习java太棒了","analyzer": "ik_smart" }概念 语法规则 HTTP_METHOD /index/_action/IDHTTP_METHOD 是 HTTP 请求的方法&#xff0c;常见的包括…...

影响PPC广告成本预算的因素,如何计算亚马逊PPC广告预算——站斧浏览器

亚马逊PPC&#xff0c;又称按点击付费(Pay Per Click)&#xff0c;是一种只有用户点击你的广告时才会向你收费的模式。那么影响PPC广告成本预算的因素,如何计算亚马逊PPC广告预算&#xff1f; 影响PPC广告成本预算的因素 1、产品类别&#xff1a;不同类别的产品竞争程度不同&…...

Qt 信号和槽

目录 概念 代码 mainwindow.h me.h xiaohuang.h main.cc mainwindow.cc me.cc xianghuang.cc mainwindow.ui 自定义信号的要求和注意事项: 自定义槽的要求和注意事项: 概念 信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽&#xff0c;实际就是观察者模式(发布-订…...

Linux基本命令二

Linux基本命令二 1、head 命令 head ​ **作用&#xff1a;**用于查看文件的开头部分的内容&#xff0c;有一个常用的参数 -n 用于显示行数&#xff0c;默认为 10&#xff0c;即显示 10 行的内容 ​ **语法&#xff1a;**head [参数] [文件] ​ 命令参数&#xff1a; 参数…...

isbn api开放接口

接口地址&#xff1a;http://openapi.daohe168.com.cn/api/library/isbn/query?isbn9787115618085&appKeyd7c6c07a0a04ba4e65921e2f90726384 响应结果&#xff1a; { "success": true, "code": "200", "message": …...

助力企业实现更简单的数据库管理,ATOMDB 与 TDengine 完成兼容性互认

为加速数字化转型进程&#xff0c;当下越来越多的企业开始进行新一轮数据架构改造升级。在此过程中&#xff0c;全平台数据库管理客户端提供了一个集中管理和操作数据库的工具&#xff0c;提高了数据库管理的效率和便利性&#xff0c;减少了人工操作的复杂性和错误率&#xff0…...

越用越强不是广告语:拆解 Hermes Agent 的三层学习机制

用 AI agent 有一段时间了&#xff0c;有个问题一直没解决&#xff1a;每次开新会话&#xff0c;它对我的项目和习惯还是一无所知。上下文配置文件里写了不少&#xff0c;但写进去的是静态的——它不会自己学&#xff0c;也不会根据我真实的操作习惯去调整。跑得熟不熟&#xf…...

从 MVVMLight 到 CommunityToolkit.Mvvm:MVVM 框架的现代化演进与全面对比

本文围绕 MVVMLight 与 CommunityToolkit.Mvvm 的演进脉络、核心对比、实操差异及迁移指南 展开&#xff0c;帮助开发者快速完成技术选型与项目升级。在 WPF、UWP、MAUI、WinUI 3 等 XAML 技术体系中&#xff0c;MVVM 是实现界面与业务逻辑解耦的核心架构模式。 提到 MVVM 框架…...

Stable Yogi Leather-Dress-Collection企业案例:ACG品牌联名款服装概念图生成

Stable Yogi Leather-Dress-Collection企业案例&#xff1a;ACG品牌联名款服装概念图生成 想象一下&#xff0c;你是一家ACG&#xff08;动画、漫画、游戏&#xff09;潮牌的设计师。下个季度要和一部热门动漫IP联名&#xff0c;主题是“赛博朋克机车风”。老板要求你在三天内…...

如何通过手机号码实现精准地理位置查询:完整技术实现指南

如何通过手机号码实现精准地理位置查询&#xff1a;完整技术实现指南 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_m…...

MFC中单选框与复选框控件的实战应用与优化技巧

1. MFC单选框与复选框控件基础入门 第一次接触MFC的单选框(Radio Button)和复选框(CheckBox)时&#xff0c;我完全被它们的组属性搞晕了。记得当时做了个问卷调查界面&#xff0c;结果所有单选框都能同时选中&#xff0c;简直是个灾难现场。后来才发现&#xff0c;原来MFC的单选…...

别再只用P=I²R了!手把手教你用Excel搞定MOSFET开关损耗(附计算模板)

别再只用PIR了&#xff01;手把手教你用Excel搞定MOSFET开关损耗&#xff08;附计算模板&#xff09; 在电源设计领域&#xff0c;MOSFET的功耗计算一直是工程师的必修课。但现实中&#xff0c;许多人仍停留在简单的导通损耗计算&#xff08;PIR&#xff09;阶段&#xff0c;忽…...

重构浏览器书签管理哲学:Neat Bookmarks的树形思维与信息架构实践

重构浏览器书签管理哲学&#xff1a;Neat Bookmarks的树形思维与信息架构实践 【免费下载链接】neat-bookmarks A neat bookmarks tree popup extension for Chrome [DISCONTINUED] 项目地址: https://gitcode.com/gh_mirrors/ne/neat-bookmarks 当数字书签堆积如山&…...

Android Studio+TensorFlow Lite实战:5分钟搞定图片分类APP(附完整APK生成教程)

Android Studio与TensorFlow Lite极速开发&#xff1a;图片分类APP从零到APK全流程 在移动端AI应用开发领域&#xff0c;TensorFlow Lite以其轻量化和高性能特性成为开发者的首选。本文将带你用最短时间完成一个具备图片分类功能的Android应用&#xff0c;从环境配置到APK生成&…...

在国产ARM服务器上,手把手教你离线搞定RabbitMQ 3.8.8和Erlang 22.1(含依赖包下载指南)

国产ARM服务器离线部署RabbitMQ 3.8.8全栈指南&#xff1a;从依赖包下载到集群配置 在信创产业快速推进的背景下&#xff0c;越来越多的企业开始将核心业务系统迁移到国产ARM架构服务器。当我在某金融客户的鲲鹏920服务器集群上首次实施RabbitMQ离线部署时&#xff0c;深刻体会…...

新手必看:星图平台5步搞定Qwen3-VL:30B私有化部署,打造飞书看图聊天机器人

新手必看&#xff1a;星图平台5步搞定Qwen3-VL:30B私有化部署&#xff0c;打造飞书看图聊天机器人 1. 为什么选择Qwen3-VL:30B作为飞书助手&#xff1f; 1.1 超越普通OCR的多模态理解能力 传统图像识别工具只能识别图片中的文字或物体&#xff0c;而Qwen3-VL:30B能真正理解图…...