esp8266有音频解码功能吗?ESP8266播放音频文件
esp8266有音频解码功能吗?ESP8266播放音频文件参考下图接线,使用RX输出:https://link.zhihu.com/?target=https://github.com/earlephilhower/ESP8266Audio#installation这里有各种音频文件的播放说明,包括MOD、WAV、FLAC、MIDI、RTTTL、MP3、 AAC;除了可以播放本地存储的音频文件,还可以通过http进行流式播放;要把文件上传到ESP8266里面,需要用到一个工具:ESP8266 Sketch Data Upload 按照这个工具里面的步骤操作后,重启Arduino IDE 可以在菜单栏里面的工具下看到ESP8266 Sketch Data Upload这个选项,单击这个选项会在项目源码目录下创建一个data的文件夹,把需要上传的文件放入该文件夹之后,再次单击ESP8266 Sketch Data Upload这个选项即可以把文件上传
ESP8266播放音频文件
1、如何播放音频?
ESP8266播放音频文件可以参考:
https://github.com/earlephilhower/ESP8266Audio
这里有各种音频文件的播放说明,包括MOD、WAV、FLAC、MIDI、RTTTL、MP3、 AAC;除了可以播放本地存储的音频文件,还可以通过http进行流式播放;
要把文件上传到ESP8266里面,需要用到一个工具:ESP8266 Sketch Data Upload 按照这个工具里面的步骤操作后,重启Arduino IDE 可以在菜单栏里面的工具下看到ESP8266 Sketch Data Upload这个选项,单击这个选项会在项目源码目录下创建一个data的文件夹,把需要上传的文件放入该文件夹之后,再次单击ESP8266 Sketch Data Upload这个选项即可以把文件上传到ESP8266里面了。
安装ESP8266Audio这个用于支持播放音频的库,参考
https://link.zhihu.com/?target=https://github.com/earlephilhower/ESP8266Audio#installation
参考下图接线,使用RX输出:
另外一种接线方式:
示例代码:
// esp8266 播放音频文件
#include <Arduino.h>
#include "AudiofileSourceSPIFFS.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h"
AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2SNoDAC *out;
void setup()
{
Serial.begin(115200);
delay(1000);
SPIFFS.begin();
file = new AudioFileSourceSPIFFS("/hello.mp3");
out = new AudioOutputI2SNoDAC();
mp3 = new AudioGeneratorMP3();
mp3->begin(file out);
}
void loop()
{
if (mp3->isRunning()) {
if (!mp3->loop()) mp3->stop();
} else {
Serial.printf("MP3 done\n");
delay(1000);
}
}
TIPS:
hello.mp3需要通过ESP8266 Sketch Upload 进行上传hello.mp3最好是一个8位44.1kHZ单声道(mono)的音频文件注意文件大小,太大会导致上传失败
上面的示例代码只会在机器启动的时候播放一次。
2、如何控制播放?
一般都希望可以按自己的需要进行播放音频,比如加一个按钮触控开关,每次触发开关就播放一次音频。实现这样的小功能就需要对上面示例代码进行简单修改了。
接多一个开关:
示例代码:
// 按钮控制播放音频
#include <Arduino.h>
#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h"
AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2SNoDAC *out;
int SWITCH_PIN = D4;
int switchVal = 1;
void setup()
{
Serial.begin(9600);
delay(1000);
SPIFFS.begin();
out = new AudioOutputI2SNoDAC();
mp3 = new AudioGeneratorMP3();
pinMode(SWITCH_PIN INPUT);
}
void loop()
{
switchVal = digitalRead(SWITCH_PIN);
Serial.println(switchVal);
if (mp3->isRunning()) { // 是否在播放
if (!mp3->loop()){ // 是否播放完了
mp3->stop(); // 停止播放
delete file;
delete mp3;
mp3 = new AudioGeneratorMP3();
}
} else {
if (switchVal == 0) { // 开关接通为低电平
file = new AudioFileSourceSPIFFS("/hello.mp3"); // 初始化音频文件
Serial.printf("MP3 done\n");
delay(1000);
mp3->begin(file out); // 开始播放文件
}
}
}
TIPS
file播放一次之后就无法再次播放,所以每次播放前需要重新初始化一个音频文件
...
file = new AudioFileSourceSPIFFS("/hello.mp3");
...
音频在播放的时候loop是持续执行的,没有等待音频播放完毕;所以每次loop都是需要判断是否在播放;如果在播放,判断是否播放完成。
...
if (mp3->isRunning()){ // 判断是否在播放
if (!mp3->loop()){ // 判断是否播放完成
...
}
}
...
成功写入程序后,每次单击按钮即可播放hello.mp3。
参考资料:
ESP8266播放音频文件
https://zhuanlan.zhihu.com/p/37907663
ESP8266Audio
https://github.com/earlephilhower/ESP8266Audio
Playing Wave File Using Arduino
https://www.instructables.com/id/Playing-Wave-file-using-arduino/
用ESP8266播放音乐
https://www.jianshu.com/p/88e789a4b9de