1_MAX98357A模块
1.1_SD卡播放
sd卡格式fat32
安装库
https://github.com/schreibfaul1/ESP32-audioI2S
#include "Arduino.h"
#include "WiFi.h"
#include "Audio.h"
#include "SD.h"
#include "FS.h"
#define SD_CS 5
#define SPI_MOSI 23
#define SPI_MISO 19
#define SPI_SCK 18
#define I2S_DOUT 25
#define I2S_BCLK 26
#define I2S_LRC 27
Audio audio;
void setup() {
pinMode(SD_CS, OUTPUT);
digitalWrite(SD_CS, HIGH);
SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);
Serial.begin(115200);
SD.begin(SD_CS);
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
audio.setVolume(21); // 0...21
audio.connecttoFS(SD, "/320k_test.mp3");
}
void loop()
{
audio.loop();
}
1.2_在线播放
#include "Arduino.h"
#include "WiFiMulti.h"
#include "Audio.h"
#include <Preferences.h>
#define I2S_DOUT 37
#define I2S_BCLK 36
#define I2S_LRC 35
Preferences preferences;
Audio audio;
WiFiMulti wifiMulti;
String ssid = "FAST_BA74";
String password = "12345678";
const uint16_t port = 8000;
static String music_id = "";
WiFiServer server(port);
TaskHandle_t Task;
void setup() {
Serial.begin(115200);
preferences.begin("my-app", false);
music_id = preferences.getString("music", "1873321491");
WiFi.mode(WIFI_STA);
wifiMulti.addAP(ssid.c_str(), password.c_str());
wifiMulti.run();
if (WiFi.status() != WL_CONNECTED) {
WiFi.disconnect(true);
wifiMulti.run();
}
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
audio.setVolume(10); // 0...21
char httpPath[60];
sprintf(httpPath, "%s%s%s", "http://music.163.com/song/media/outer/url?id=", music_id, ".mp3");
Serial.println(httpPath);
audio.connecttohost(httpPath); // 128k mp3
xTaskCreatePinnedToCore(
Taskcode, /* Task function. */
"Task", /* name of task. */
10000, /* Stack size of task */
NULL, /* parameter of the task */
0, /* priority of the task */
&Task, /* Task handle to keep track of created task */
0); /* pin task to core 1 */
}
void loop() {
audio.loop();
}
//Taskcode
void Taskcode(void *pvParameters) {
Serial.println(WiFi.localIP());
server.begin();
for (;;) {
WiFiClient client = server.available(); //尝试建立客户对象
if (client) //如果当前客户可用
{
Serial.println("[Client connected]");
while (client.connected()) //如果客户端处于连接状态
{
if (client.available()) //如果有可读数据
{
audio.stopSong();//停止播放
String c = client.readStringUntil('\n');
Serial.print(c);
preferences.putString("music", c);
preferences.end();
client.stop();
esp_restart();
}
}
client.stop(); //结束当前连接:
Serial.println("[Client disconnected]");
}
}
vTaskDelay(1000);
}
2_使用ESP32播放视频
请参考这篇博客和仓库
https://www.instructables.com/Play-Video-With-ESP32/#click=https://t.co/VoUEG8SGMU
https://github.com/moononournation/RGB565_video
安装以下库
https://github.com/moononournation/Arduino_GFX
https://github.com/earlephilhower/ESP8266Audio
SDIO模块(使用SD 1bit模式)
CLK = 14
CMD = 15
DAT0 = 2
ST7789v模块
SCL = 18
SDA = 23
RES = 33
DC = 27
CS = 5
3.5mm耳机接口模块
TIP = 25
RING1 = 26
RING2 = GND
SLEEVE = 悬空
安装ffmpeg
sudo apt-get install ffmpeg
使用FFmpeg制作音频和动画
ffmpeg -i input.mp4 -f u16be -acodec pcm_u16le -ar 44100 -ac 1 44100_u16le.pcm
ffmpeg -i input.mp4 -vf "fps=30,scale=-1:176:flags=lanczos,crop=220:in_h:(in_w-220)/2:0" -q:v 9 220_30fps.mjpeg
移植SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask目录中的内容
移植后
由于gif没有声音其实播放有声音