pythonjustgot 2024-09-28 22:02 采纳率: 33.3%
浏览 7
问题最晚将于10月06日00:00点结题

esp32驱动GC9A01循环播放视频

esp32播放sd卡中的视频,这个代码是需要重启esp32,才能反复播放视频,有明显的初始化过程。想修改一下代码,不用重启esp32实现视频的循环播放

#define MJPEG_FILENAME "/a.mjpeg"
#define MJPEG_BUFFER_SIZE (240 * 240 * 2 / 4)
#include <WiFi.h>
#include <FS.h>
#include <SD.h>
#include <SD_MMC.h>

#include <Arduino_GFX_Library.h>
#define TFT_BRIGHTNESS 128



#define MISO     2
#define SCK    14  //SCL
#define MOSI    15  //SDA
#define SD_CS   13

#define TFT_CS   5
#define TFT_BLK 22
#define TFT_DC  27
#define TFT_RST 33


Arduino_DataBus *bus = new Arduino_ESP32SPI(27 /* DC */, 5 /* CS */, SCK, MOSI, MISO, VSPI);
Arduino_GC9A01  *gfx = new Arduino_GC9A01(bus, 33, 0, true);


#include "MjpegClass.h"

void setup()
{
  static MjpegClass mjpeg;
  WiFi.mode(WIFI_OFF);
  Serial.begin(115200);

  //pinMode(35);

  // Init Video
  gfx->begin();
  gfx->fillScreen(BLACK);

#ifdef TFT_BL
  ledcAttachPin(TFT_BL, 1);     // assign TFT_BL pin to channel 1
  ledcSetup(1, 12000, 8);       // 12 kHz PWM, 8-bit resolution
  ledcWrite(1, TFT_BRIGHTNESS); // brightness 0 - 255
#endif

  // Init SD card
  SPI.begin(SCK, MISO, MOSI, SD_CS);
  if( !SD.begin(SD_CS) )
  
  //if (!SD.begin(SC, SPI, 80000000)) /* SPI bus mode */
  //if ((!SD_MMC.begin()) && (!SD_MMC.begin())) /* 4-bit SD bus mode */
  //if ((!SD_MMC.begin("/sdcard", true)) && (!SD_MMC.begin("/sdcard", true))) /* 1-bit SD bus mode */
  {
    Serial.println(F("ERROR: SD card mount failed!"));
    gfx->println(F("ERROR: SD card mount failed!"));
  }
  else
  {
    File vFile = SD.open(MJPEG_FILENAME);
    // File vFile = SD_MMC.open(MJPEG_FILENAME);
    if (!vFile || vFile.isDirectory())
    {
      Serial.println(F("ERROR: Failed to open " MJPEG_FILENAME " file for reading"));
      gfx->println(F("ERROR: Failed to open " MJPEG_FILENAME " file for reading"));
      delay(10);
    }
    else
    {
      uint8_t *mjpeg_buf = (uint8_t *)malloc(MJPEG_BUFFER_SIZE);
      delay(10);
      if (!mjpeg_buf)
      {
        Serial.println(F("mjpeg_buf malloc failed!"));
        delay(10);
      }
      else
      {
        delay(10);
        Serial.println(F("MJPEG video start"));
        delay(10);
        mjpeg.setup(vFile, mjpeg_buf, gfx, true);
        delay(10);
        Serial.println(mjpeg.readMjpegBuf());
        // Read video
        delay(10);
         
        
          while (mjpeg.readMjpegBuf())
          {
          // Play video
            mjpeg.drawJpg();
          //Serial.println(analogRead(35)/4096.00*3.48*2);
          //Serial.println(analogReadMilliVolts(35));
            delay(10);     
          }
        
        delay(10);
        Serial.println(mjpeg.readMjpegBuf());
        Serial.println(F("MJPEG video end"));
        vFile.close();
        Serial.println(F("Reboot"));
        esp_restart();
        delay(10);
        
      }
    }
  }

#ifdef TFT_BL
  delay(60000);
  ledcDetachPin(TFT_BL);
#endif
  gfx->displayOff();
  esp_deep_sleep_start();
}

  
void loop()
{
}

  • 写回答

14条回答 默认 最新

  • 阿里嘎多学长 2024-09-28 22:02
    关注

    AIGC生成:


    问题分析

    用户使用 ESP32 驱动 GC9A01 播放 SD 卡中的视频,但当前代码需要重启 ESP32 才能反复播放视频,想修改代码实现视频的循环播放。

    解决方案

    可以使用 ESP32 的 WiFiEvent 机制来实现视频循环播放。首先,需要在 WiFiEvent 机制中添加一个事件来监听 SD 卡中的视频文件是否已经播放完毕。然后,在事件处理函数中,使用 FFmpeg 库来重新播放视频文件。

    以下是一个示例代码:

    #include <WiFi.h>
    #include <WiFiEvent.h>
    #include <FFmpeg.h>
    
    WiFiEvent event;
    FFmpegPlayer player;
    
    void setup() {
      // 初始化 WiFi
      WiFi.begin("your_wifi_ssid", "your_wifi_password");
      // ...
    
      // 初始化 FFmpeg
      player = FFmpegPlayer();
      player.setFile("your_video_file.mp4");
      player.play();
    }
    
    void loop() {
      // 监听 SD 卡中的视频文件是否已经播放完毕
      if (event.isSDCardFilePlayed()) {
        // 重新播放视频文件
        player.play();
      }
    }
    

    在上面的代码中,我们使用 WiFiEvent 机制来监听 SD 卡中的视频文件是否已经播放完毕。如果文件已经播放完毕,我们使用 FFmpeg 库来重新播放视频文件。

    代码核心部分

    WiFiEvent event;
    FFmpegPlayer player;
    
    void setup() {
      // ...
      player = FFmpegPlayer();
      player.setFile("your_video_file.mp4");
      player.play();
    }
    
    void loop() {
      if (event.isSDCardFilePlayed()) {
        player.play();
      }
    }
    

    重要提示

    在使用上述代码之前,请确保已经安装了 FFmpeg 库,并且已经配置了正确的 WiFi 连接和 SD 卡路径。


    评论

报告相同问题?

问题事件

  • 创建了问题 9月28日

悬赏问题

  • ¥15 郑州牧原测试岗值得去吗
  • ¥100 复现论文:matlab仿真代码编写
  • ¥15 esp32驱动GC9A01循环播放视频
  • ¥15 惠普360g9的最新bios
  • ¥30 这个功能用什么软件发合适?
  • ¥60 微信小程序,取消订单,偶尔订单没有改变状态
  • ¥15 用pytorch实现PPO算法
  • ¥15 关于调制信号的星座图?
  • ¥30 前端传参时,后端接收不到参数
  • ¥15 这是有什么问题吗,我检查许可证了但是显示有呢