零基础学ESP32:播放音乐——从本地到网络,让ESP32变身音乐播放器!

前面我们学了蜂鸣器播放旋律,但那只是单音调。今天,我们要让ESP32真正“播放音乐”——从本地WAV文件到网络在线音乐,统统拿下!

无论是播放一段语音提示、一首完整的歌曲,还是做一个网络收音机,ESP32都能轻松胜任。

今天这节课,我们就从本地播放开始,再到网络播放,一步步让ESP32变身音乐播放器!

第一步:找到课程,看看成品效果

打开逗脑IDE,点击顶部 “文档”,在 “课程” → “ESP32 + MicroPython” 分类下,找到播放音乐。

在这里插入图片描述

打开课件,你会看到本节课的最终效果:ESP32连接音频模块后,先播放本地存储的WAV音频,再通过WiFi播放网络上的音乐,声音从耳机或小喇叭中清晰传出。

在这里插入图片描述

第二步:播放音频的原理

整体架构:

ESP32读取音频数据(本地/网络) → 通过I2S接口发送 → 音频DAC芯片 → 耳机/喇叭发出声音

两个关键概念:

1. I2S(Inter-IC Sound)

I2S是一种专门用于音频数据传输的通信协议。

三根核心信号线:

信号线

名称

作用

BCLK

位时钟

控制数据传输节奏

LRC

左右声道时钟

区分左右声道数据

DIN

数据输入

传输音频数据本身

2. WAV文件格式

WAV文件的前44个字节存储了文件头信息(采样率、声道数、位深等),从第44字节开始才是真正的音频数据。

WAV文件结构:
[文件头 44字节] [音频数据 ...]
                  ↑
              从这里开始读取

第三步:动手接线

I2S音频模块通常有5个引脚,接线如下:

模块引脚

功能

连接ESP32

说明

VCC

电源正极

3.3V

 或 5V

按模块要求

GND

电源地

GND

公共地

DIN

数据输入

GPIO13

接SD(串行数据)

BCLK

位时钟

GPIO12

接SCK(串行时钟)

LRC

左右声道时钟

GPIO14

接WS(字选择)

在这里插入图片描述

第四步:I2S驱动——MicroPython内置支持!

MicroPython内置了I2S库,直接导入即可使用:

from machine import I2S, Pin

# 定义引脚
sck_pin = Pin(12)   # 串行时钟(BCLK)
ws_pin = Pin(14)    # 字选择(LRC)
sd_pin = Pin(13)    # 串行数据(DIN)

# 初始化I2S(发送模式)
audio_out = I2S(
    1,                           # I2S总线ID
    sck=sck_pin,                 # 时钟引脚
    ws=ws_pin,                   # 字选择引脚
    sd=sd_pin,                   # 数据引脚
    mode=I2S.TX,                 # 发送模式
    bits=16,                     # 采样位深(16位)
    format=I2S.MONO,             # 单声道
    rate=16000,                  # 采样率16kHz
    ibuf=20000                   # 内部缓冲区大小
)

第一部分:播放本地WAV文件

第五步:准备音频文件

先下载test.wav音频文件,上传到ESP32:

在这里插入图片描述

📌 注意: WAV文件要放在ESP32的根目录下,与代码文件在同一级。

第六步:本地播放代码

from machine import I2S, Pin

# 初始化I2S
sck_pin = Pin(12)
ws_pin = Pin(14)
sd_pin = Pin(13)

audio_out = I2S(1, sck=sck_pin, ws=ws_pin, sd=sd_pin, 
                mode=I2S.TX, bits=16, format=I2S.MONO, 
                rate=16000, ibuf=20000)

# 打开本地WAV文件
wavtempfile = "test.wav"
with open(wavtempfile, 'rb') as f:
    # 跳过文件头44字节
    f.seek(44)

    # 创建缓冲区
    wav_samples = bytearray(1024)
    wav_samples_mv = memoryview(wav_samples)

    print("开始播放本地音频...")

    while True:
        num_read = f.readinto(wav_samples_mv)
        if num_read == 0:
            break
        num_written = 0
        while num_written < num_read:
            num_written += audio_out.write(wav_samples_mv[num_written:num_read])

本地播放代码逻辑:

步骤

操作

说明

1

f.seek(44)

跳过WAV文件头

2

f.readinto(buffer)

每次读取1024字节到缓冲区

3

audio_out.write()

将数据写入I2S播放

4

循环直到文件结束

整首歌完整播放

第二部分:播放网络音乐

第七步:网络播放——边下边播!

本地播放学会了,接下来升级到网络播放。只需要把数据来源从本地文件换成网络请求,其他逻辑完全相同!

from machine import I2S, Pin
import urequests
import network
import time

# ========== 1. 配置WiFi ==========
def do_connect():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect('你的WiFi名称', '你的WiFi密码')
        i = 1
        while not wlan.isconnected():
            print("正在连接...第{}次".format(i))
            i += 1
            time.sleep(1)
    print('连接成功!IP:', wlan.ifconfig())

do_connect()

# ========== 2. 初始化I2S(注意采样率提高到44100)==========
sck_pin = Pin(12)
ws_pin = Pin(14)
sd_pin = Pin(13)

audio_out = I2S(1, sck=sck_pin, ws=ws_pin, sd=sd_pin,
                mode=I2S.TX, bits=16, format=I2S.MONO,
                rate=44100, ibuf=20000)  # 网络音乐用CD音质!

# ========== 3. 网络请求获取音频 ==========
# ⚠️ 注意:必须用 http://,不支持 https://
response = urequests.get(
    "http://服务器地址/歌曲名.wav",
    stream=True
)

# 跳过WAV文件头44字节
response.raw.read(44)

print("开始播放网络音频...")

# ========== 4. 流式播放 ==========
while True:
    try:
        content_byte = response.raw.read(1024)
        if len(content_byte) == 0:
            break
        audio_out.write(content_byte)
    except Exception as e:
        print("播放异常:", e)
        break

audio_out.deinit()

网络播放的关键区别:

步骤

本地播放

网络播放

获取数据 f.readinto(buffer) response.raw.read(1024)
跳过文件头 f.seek(44) response.raw.read(44)
数据来源

本地存储

网络服务器

需要WiFi

❌ 不需要

✅ 必须联网

第八步:保存运行,听效果!

本地播放运行流程:

  1. 上传test.wav到ESP32

  2. 保存并运行本地播放代码

  3. 终端打印“开始播放本地音频…”

  4. 耳机/喇叭传出音乐!

网络播放运行流程:

  1. 修改WiFi名称和密码

  2. 修改音频文件的网络URL

  3. 保存并运行网络播放代码

  4. 终端显示“连接成功…”和“开始播放网络音频…”

  5. 耳机/喇叭传出网络音乐! ### 两种播放方式对比总结

对比项

本地播放

网络播放

数据来源

本地WAV文件

HTTP网络请求

需要WiFi

❌ 不需要

✅ 需要

音频存储

ESP32存储

网络服务器

歌曲数量

受存储限制

几乎无限

播放方式

读完即播

边下边播

适用场景

固定语音提示

在线音乐、网络电台

播放音乐能做什么?

应用场景

推荐方式

用途

语音提示器

本地

“欢迎光临”、“温度过高”等提示

门铃/警报器

本地

播放自定义门铃声

在线音乐播放器

网络

播放云端音乐库

网络收音机

网络

播放网络电台流媒体

智能语音播报

网络

从服务器获取语音并播放

远程音频推送

网络

手机/电脑推送音频到ESP32

全程回顾

步骤

操作

效果

找到课程

文档→课程→ESP32+MicroPython→播放音乐

了解I2S音频播放

认识原理

I2S协议 + WAV文件格式

理解音频播放原理

动手接线

VCC→3.3V, GND→GND, DIN→GPIO13, BCLK→GPIO12, LRC→GPIO14

硬件就位

本地播放

上传test.wav → 运行本地音频代码

播放本地音乐

网络播放

修改WiFi和URL → 运行网络音频代码

播放网络音乐

如果你对本节课感兴趣,去官网(www.dounao.cn)下载逗脑IDE,准备好相关配件,跟着课件走一遍。

有任何问题或建议,欢迎在评论区留言告诉我们。

发表评论