6_Arduino-ESP32_MAX98357A模块,使用ESP32播放视频

5,202 阅读2分钟

1_MAX98357A模块

1.1_SD卡播放

1.jpg

sd卡格式fat32

安装库

https://github.com/schreibfaul1/ESP32-audioI2S

image.png

#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播放视频


01.jpg

请参考这篇博客和仓库

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模式)

02.jpg

CLK = 14
CMD = 15
DAT0 = 2

ST7789v模块

SCL = 18
SDA = 23
RES = 33
DC = 27
CS = 5

3.5mm耳机接口模块

46644067-cf429380-cb4c-11e8-9151-79ced8d72977.png

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目录中的内容

image.png

移植后

image.png

由于gif没有声音其实播放有声音

20210613_230449.gif