所需材料
接线步骤
播放本地音乐
from machine import I2S # 导入I2S协议库,什么是I2S自行百度
from machine import Pin
"""
GPIO13 -- DIN
GPIO12 --- BCLK
GPIO14 -- LRC
GND -- GND
5V或3.3V -- VCC
"""
# 初始化引脚定义
sck_pin = Pin(12) # 串行时钟输出
ws_pin = Pin(14) # 字时钟
sd_pin = Pin(13) # 串行数据输出
"""
sck 是串行时钟线的引脚对象
ws 是单词选择行的引脚对象
sd 是串行数据线的引脚对象
mode 指定接收或发送
bits 指定样本大小(位),16 或 32
format 指定通道格式,STEREO(左右声道) 或 MONO(单声道)
rate 指定音频采样率(样本/秒)
ibuf 指定内部缓冲区长度(字节)
"""
# 初始化i2s
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)
wavtempfile = "test.wav"
with open(wavtempfile,'rb') as f:
# 跳过文件的开头的44个字节,直到数据段的第1个字节
pos = f.seek(44)
# 用于减少while循环中堆分配的内存视图
wav_samples = bytearray(1024)
wav_samples_mv = memoryview(wav_samples)
print("开始播放音频...")
#并将其写入I2S DAC
while True:
try:
num_read = f.readinto(wav_samples_mv)
# WAV文件结束
if num_read == 0:
break
# 直到所有样本都写入I2S外围设备
num_written = 0
while num_written < num_read:
num_written += audio_out.write(wav_samples_mv[num_written:num_read])
except Exception as ret:
print("产生异常...", ret)
break
播放网络音乐
from machine import I2S
from machine import Pin
import urequests
import network
import time
"""
GPIO12 --- BCLK
GPIO14 --- LRC
GPIO13 --- DIN
GND --- GND
5V --- VCC
"""
# 初始化引脚定义
sck_pin = Pin(12) # 串行时钟输出
ws_pin = Pin(14) # 字时钟
sd_pin = Pin(13) # 串行数据输出
"""
sck 是串行时钟线的引脚对象
ws 是单词选择行的引脚对象
sd 是串行数据线的引脚对象
mode 指定接收或发送
bits 指定样本大小(位),16 或 32
format 指定通道格式,STEREO(左右声道) 或 MONO(单声道)
rate 指定音频采样率(样本/秒),数值越大播放速度越快
ibuf 指定内部缓冲区长度(字节)
"""
# 初始化i2s
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)
# 连接网络函数
def do_connect():
"""链接WIFI网络"""
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect('WIFI名字', 'WIFI密码') # WIFI名字密码
i = 1
while not wlan.isconnected():
print("正在链接中...{}".format(i))
i += 1
time.sleep(1)
print('network config:', wlan.ifconfig())
# 连接网络
do_connect()
# 注意不要用https,要用http
response = urequests.get("http://doc.itprojects.cn/0006.zhishi.esp32/01.download/audio/chaojimali.wav", stream=True)
response.raw.read(44) # 跳过开头的44字节音频文件头信息
print("开始播放音频...")
#并将其写入I2S DAC
while True:
try:
content_byte = response.raw.read(1024) # 每次读取1024个字节
# 判断WAV文件是否结束
if len(content_byte) == 0:
break
# 调用I2S对象播放音频
audio_out.write(content_byte)
except Exception as ret:
print("程序产生异常...", ret)
audio_out.deinit()
break
audio_out.deinit() # 音乐播放完毕后,退出
© 版权声明
THE END
暂无评论内容