ESP32小智AI实现在线音乐播放功能
文章目录
1.关于在线网络音乐播放问题
提示:注意非法爬取网络音乐流涉嫌侵权,建议使用第三方代理平台正规获取音频api
API 简介
API(Application Programming Interface,应用程序编程接口)是一组预定义的规则和协议,允许不同软件系统之间进行通信和数据交换。它定义了如何请求服务、传递数据以及接收结果,无需了解底层实现细节。
API 的核心作用
- 抽象复杂性:隐藏内部实现,仅暴露必要的功能。
- 标准化交互:提供统一的请求和响应格式(如 HTTP、JSON)。
- 促进扩展:允许第三方开发者基于现有系统构建新功能。
API 常见类型
- Web API:基于 HTTP 协议,如 RESTful API、GraphQL。
- 库/框架 API:编程语言提供的接口,如 Python 的
requests库。 - 操作系统 API:调用系统功能,如 Windows API。
API 工作原理示例
- 客户端发送请求:通过 HTTP 方法(GET/POST)访问 API 端点(URL)。
- 服务器处理请求:验证权限并执行操作(如查询数据库)。
- 返回响应:以结构化数据(如 JSON)返回结果。
# 示例:调用天气 API 获取数据
import requests
response = requests.get("https://api.weather.com/data?city=Beijing")
print(response.json()) # 输出 JSON 格式的天气数据
API 的应用场景
- 跨平台数据同步(如社交媒体登录)。
- 微服务架构中的服务通信。
- 第三方服务集成(如支付、地图)。
API 是现代软件开发的基础工具,通过标准化接口降低协作成本,提升开发效率。
音频流API调用示例
对于小智AI实现音乐播放,这里我建议使用妖狐api的在线音乐服务,因为实测下来这是个比较稳定的api提供商,大家可以自行注册注册一个账号,然后平台会默认给你生成一个api秘钥,请自行保管不要轻易泄露给别人,这个秘钥在大部分的api调用里边都要作为参数传入,我们打开妖狐api里边的音乐服务专区,这里我以网易云音乐作为示例如何请求一个音频流。
选择免费接入即可(大部分需要版权的VIP歌曲依旧没法获取),可以看到需要传入三个参数,第一个是你的秘钥,第二个是歌曲名称,第三个是返回的结果,我们选择第一个填1即可(大概率第一首歌曲是原唱)

点击发送请求,可以看到如下结果:
该请求结果返回的是一个json格式,我们可以看到以下字段:歌手名称,歌曲封面,和实际的音频流地址(打开后默认黑色背景下出现一个播放条),这些网址我们都可以自行打开查看,而对我们来说音频流地址才是至关重要的信息,因为我们需要使用ESP32模拟浏览器发送请求并从json中解析获得音频流的地址从而实现解码播放。
2.整体架构流程
提示:该项目的硬件实现音乐播放参考于【【开源】虾哥小智音乐播放器纯固件-哔哩哔哩】 https://b23.tv/Ps5BVoW
B站视频传送门
music-proxy-server/
├── server.js # 主服务器
├── package.json
├── config.js # API密钥配置
├── temp/ # 临时转码文件
├── cache/ # API响应缓存
└── public/ # 网页管理界面
├── index.html
├── style.css
└── script.js
为了使小智Ai实现在线音乐播放的功能,这个寒假我参考了B站up开源的小智AI音乐源码,并实际编译体验,发现确实可以实现在线点歌的功能,然而基于歌曲版权问题,大部分歌曲是无版权无法正常播放,官方也并不推荐我们使用非法手段去获取歌曲的直链,加上服务器部署在公网上费用依旧是个问题。所以我基于node.js框架做了一个音乐转码的服务端,转码音频来源于妖狐的api调用,主要是对qq音乐的音源进行转码,为此我自费买了妖狐专业版vip的会员,否则将限制对歌曲直链的调用。当然使用网易和咪咕,酷我的音源也没问题,基于歌曲种类和数量版权问题,我选择了qq音乐这个相对稳定的平台,依托于服务器的ffmpeg转码组件,将mp3等格式的音频转换为mp3或是opus(ogg)格式的音频。在此之前,你可能会疑惑,既然妖狐平台提供了歌曲的api,那为什么我不直接调用妖狐的歌曲直链呢,实际上也行,我查看了官方的开源网络音乐的源码,他们用的是自建服务器下发音频,代码中写明服务器的ip或者是域名,通过传入歌曲的名称拼接完整的歌曲访问直链然后下载缓存于psram中,或者返回带歌曲专辑直链等信息的json,通过解析其中的直链来对歌曲进行解析播放,代码中的music.cc文件引用了mp3的解码组件,意味着我们调用的歌曲必须是mp3格式的,实际上事情没有那么简单,之后自己尝试更换妖狐的api三大音频平台,结果发现有些平台返回的歌曲直链不是mp3格式没法正常解析,即使是mp3格式的音频,例如qq的音频,我发现基于现有代码烧录后播放会存在卡顿现象,但是网易云的歌曲不会存在卡顿现象。
3.音乐转码服务器的工作流程
仅供参考项目完整源码已上传github
源码仓库
前端界面(Vue.js) → 后端API(Node.js) → 音频转码(FFmpeg) → ESP32音频流
↑ ↑ ↑
点歌/控制 API代理/任务管理 Opus(Ogg)转码
↓
临时文件存储
↓
ESP32流式播放
ESP32调用音乐转码服务器API 服务器对外开放api接口
音频格式说明
- Opus 16kHz: 适合ESP32,文件小,延迟低
- MP3 128kHz: 音质更好,适合高带宽场景
ESP32访问歌曲直链URL
// Opus格式(推荐)示例如下
http://192.168.151.21:3000/api/stream/歌曲名_歌手_16k.opus
// MP3格式
http://192.168.151.21:3000/api/stream/Audio_mp3/歌曲名_歌手_128k.mp3
// 静态文件访问
http://192.168.151.21:3000/temp/歌曲名_歌手_16k.opus
http://192.168.90.65:3000/api/files/
🎯 IP发现: GET /api/esp32/discover
🔍 MP3搜索: GET /api/esp32/search/mp3?keyword=歌曲名
🎵 OPUS搜索: GET /api/esp32/search/opus?keyword=歌曲名
📡 MP3流地址: http://192.168.80.1:3000/api/stream/文件名.mp3
📡 OPUS流地址: http://192.168.80.1:3000/api/stream/文件名.opus
🎶 触发转码api http://localhost/api/transcode-and-stream?source=QQ&keyword=<歌曲名称>&bitrate=16k
简要说明:浏览器输入触发转码api,即可向服务器发送转码请求http://localhost/api/transcode-and-stream?source=QQ&keyword=<歌曲名称>&bitrate=16k,服务器自动完成音频的下载转码清除任务,然后再次访问下载转码好的opus音频直链即可(16kbit是opus流,128kbit是mp3流),而esp32同样是执行这样的操作。
前端界面
自行注册一个账号即可登录进入服务器转码主页。
我们手动测试,选择一个音乐平台,输入转码的歌曲名称,点击搜索自动触发转码,随后可以看到返回结果,同时打开文件管理界面也可以看到下载好的歌曲
值得注意的是,QQ音乐采用的我的密钥,如若没有付费vip是没法进行正常转码的,没有版权大家记得在使用手册里边更换为自己的妖狐api密钥或是切换音乐平台。
访问以下页面使用不同功能:
http://localhost:3000/index.html- 主页http://localhost:3000/music_api.html- 音乐API
…
这是而外拓展的功能。
3. 服务器的部署
既然项目已经运行起来了那为什么还要部署在公网上,这当然是为了让网络用户都可以接入服务api,如果作为商用项目或是面向用户,自然是要放在公网上,如果仅仅是作为个人项目的简单测试,大可不必这么破费麻烦。
为了使本地运行的项目暴露在公网,我们可以选择内网穿透或者自行购买一个公网ip,内网穿透的稳定性和速度实测下来令人堪忧,而且你得24小时以上确保你的设备不断电,当然如果你有钱去买一个树莓派当我没说,或者使用免费的内网穿透工具frp也可以。
这里推荐使用阿里云服务器,阿里云有新人优惠68/年的轻量应用服务器,买了不算亏,或者免费试用3个月的ECS云服务器,用来做网络服务相关的毕设其实也很不错。
购买了服务器可以自行选择操作系统
这里为了避免国内服务器需要备案,可以选择香港🇭🇰的服务器
操作系统我选择了默认的linux的操作系统,但是我没考虑到我原先的项目是在windows操作系统下运行的,结果搬到linux下ffmpeg转码组件没法生效导致没法执行正常的转码操作,于是我又重新修改了一下代码,以适配两个不同的操作系统,把原先windows项目中的node组件全部移除,在linux下重装对应的ffmpeg组件,node.js环境
进入目录下重新启动音乐服务项目,cd:/root/music-proxy-server
启动项目
node server.js
服务器默认运行在3000 端口上
记得安全组开放3000端口,否则浏览器无法正常访问服务器
完整部署在公网后,输入网址
http://localhost:3000/index.html即可登录服务器管理界面
4.实物演示
ESP32网络发送转码请求

附上固件和源代码:
https://pan.baidu.com/s/1SVXeELVIn8tXOlKbVeo7ZQ
提取码:302e
服务器源码暂不提供需要自行加群获取。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)