Bonjour,
Petit message pour des infos sur mon projet.
J'ai réussi à faire fonctionner ce code suivant en me servant de l'IDE 1.8 :
// Démo ArduCAM Mini (C)2017 Lee
  // Web : http://www.ArduCAM.com
  // Ce programme est une démonstration de l'utilisation de la plupart des fonctions
  // de la bibliothèque avec caméra ArduCAM ESP32 2MP/5MP.
  // Cette démo a été réalisée pour la caméra ArduCAM ESP32 2MP/5MP.
  // Il peut prendre des photos et les envoyer sur le Web.
  // Il peut prendre des photos en continu sous forme de flux vidéo et les envoyer sur le Web.
  // L'esquisse de démonstration effectuera les tâches suivantes :
  // 1. Réglez l'appareil photo sur le mode de sortie JPEG.
  // 2. si le serveur reçoit "adresse IP/capture", il peut prendre une photo et l'envoyer sur le Web.
  // 3.si le serveur reçoit "adresse IP/flux", il peut prendre des photos en continu en tant que vidéo
  //streaming et envoi sur le Web.
  
  // Ce programme nécessite la bibliothèque ArduCAM V4.0.0 (ou ultérieure) et la caméra ArduCAM ESP32 2MP/5MP
  // et utilisez le compilateur Arduino IDE 1.8.1 ou supérieur
  
  #include <WiFi.h>
  #include <Wire.h>
  #include <ESP32WebServer.h>
  #include <ArduCAM.h>
  #include <SPI.h>
  #include "memorysaver.h"
  
  #if !(defined ESP32 )
  #error Please select the ArduCAM ESP32 UNO board in the Tools/Board
  #endif
  //Cette démo ne peut fonctionner que sur la plateforme OV2640_MINI_2MP ou ARDUCAM_SHIELD_V2.
  #if !(defined (OV2640_MINI_2MP)|| defined (OV2640_MINI_2MP_PLUS)||defined (OV5640_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP_PLUS) \
      || defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) \
      ||(defined (ARDUCAM_SHIELD_V2) && (defined (OV2640_CAM) || defined (OV5640_CAM) || defined (OV5642_CAM))))
  #error Please select the hardware platform and camera module in the ../libraries/ArduCAM/memorysaver.h file
  #endif
  
  // définit GPIO17 comme esclave select :
  const int CS = 17;
  const int CAM_POWER_ON = D10;
  #if defined (OV2640_MINI_2MP)|| defined (OV2640_MINI_2MP_PLUS) || defined (OV2640_CAM)
    ArduCAM myCAM(OV2640, CS);
  #elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)
    ArduCAM myCAM(OV5640, CS);
  #elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
    ArduCAM myCAM(OV5642, CS);
  #endif
 // vous pouvez modifier la valeur de wifiType pour sélectionner le mode Station ou AP.
  // La valeur par défaut est le mode AP.
  int wifiType = 1; // 0:Station  1:AP
  
  //Configuration du mode point d'accès
  // La valeur par défaut est arducam_esp8266. Si vous le souhaitez, vous pouvez remplacer AP_aaid par votre nom préféré
  const char *AP_ssid = "arducam_esp32"; 
  // La valeur par défaut n'est pas un mot de passe. Si vous souhaitez définir un mot de passe, mettez votre mot de passe ici
  const char *AP_password = NULL;
  
  // En mode station, vous devez mettre votre ssid et votre mot de passe
  const char *ssid = "******"; // Mettez votre SSID ici
  const char *password = "*******"; // Mettez votre MOT DE PASSE ici
  
  static const size_t bufferSize = 2048;
  static uint8_t buffer[bufferSize] = {0xFF};
  uint8_t temp = 0, temp_last = 0;
  int i = 0;
  bool is_header = false;
  
  ESP32WebServer server(80);
  
  void start_capture(){
    myCAM.clear_fifo_flag();
    myCAM.start_capture();
  }
  
  void camCapture(ArduCAM myCAM){
  WiFiClient client = server.client();
  uint32_t len  = myCAM.read_fifo_length();
  if (len >= MAX_FIFO_SIZE) //8M
  //Lire les données JPEG du FIFO
  {
    Serial.println(F("Over size."));
  }
  if (len == 0 ) //0 kb
  {
    Serial.println(F("Size is 0."));
  }
  myCAM.CS_LOW();
  myCAM.set_fifo_burst(); 
  if (!client.connected()) return;
  String response = "HTTP/1.1 200 OK\r\n";
  response += "Content-Type: image/jpeg\r\n";
  response += "Content-len: " + String(len) + "\r\n\r\n";
  server.sendContent(response);
  i = 0;
  while ( len-- )
  {
  temp_last = temp;
  temp =  SPI.transfer(0x00);
  
  if ( (temp == 0xD9) && (temp_last == 0xFF) ) // Si trouver la fin, pause pendant,
  {
  buffer[i++] = temp;  // enregistre le dernier 0XD9     
  //Écrit les octets restants dans le tampon
  if (!client.connected()) break;
  client.write(&buffer[0], i);
  is_header = false;
  i = 0;
  myCAM.CS_HIGH();
  break; 
  }  
  if (is_header == true)
  { 
  // Écrit les données de l'image dans le tampon s'il n'est pas plein
  if (i < bufferSize)
  buffer[i++] = temp;
  else
  {
  // Écrit bufferSize octets de données d'image dans le fichier
  if (!client.connected()) break;
  client.write(&buffer[0], bufferSize);
  i = 0;
  buffer[i++] = temp;
  }        
  }
  else if ((temp == 0xD8) & (temp_last == 0xFF))
  {
  is_header = true;
  buffer[i++] = temp_last;
  buffer[i++] = temp;   
  } 
  } 
  }
  
  void serverCapture(){
    delay(1000);
  start_capture();
  Serial.println(F("CAM Capturing"));
  
  int total_time = 0;
  
  total_time = millis();
  while (!myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK));
  total_time = millis() - total_time;
  Serial.print(F("capture total_time used (in miliseconds):"));
  Serial.println(total_time, DEC);
  
  total_time = 0;
  
  Serial.println(F("CAM Capture Done."));
  total_time = millis();
  camCapture(myCAM);
  total_time = millis() - total_time;
  Serial.print(F("send total_time used (in miliseconds):"));
  Serial.println(total_time, DEC);
  Serial.println(F("CAM send Done."));
  }
  
  void serverStream(){
  WiFiClient client = server.client();
  
  String response = "HTTP/1.1 200 OK\r\n";
  response += "Content-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n";
  server.sendContent(response);
  
  while (1){
  start_capture();
  while (!myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK));
  size_t len = myCAM.read_fifo_length();
  if (len >= MAX_FIFO_SIZE) //8M
  {
  Serial.println(F("Over size."));
  continue;
  }
  if (len == 0 ) //0 kb
  {
  Serial.println(F("Size is 0."));
  continue;
  } 
  myCAM.CS_LOW();
  myCAM.set_fifo_burst();
  if (!client.connected()) break;
  response = "--frame\r\n";
  response += "Content-Type: image/jpeg\r\n\r\n";
  server.sendContent(response); 
  while ( len-- )
  {
  temp_last = temp;
  temp =  SPI.transfer(0x00);
  
  //Lire les données JPEG du FIFO
  if ( (temp == 0xD9) && (temp_last == 0xFF) ) // Si trouver la fin, pause pendant,
  {
  buffer[i++] = temp;  // enregistre le dernier 0XD9    
  //Écrit les octets restants dans le tampon
  myCAM.CS_HIGH();; 
  if (!client.connected()) break;
  client.write(&buffer[0], i);
  is_header = false;
  i = 0;
  }  
  if (is_header == true)
  { 
// Écrit les données de l'image dans le tampon s'il n'est pas plein
  if (i < bufferSize)
  buffer[i++] = temp;
  else
  {
  // Écrit bufferSize octets de données d'image dans le fichier
  myCAM.CS_HIGH(); 
  if (!client.connected()) break;
  client.write(&buffer[0], bufferSize);
  i = 0;
  buffer[i++] = temp;
  myCAM.CS_LOW();
  myCAM.set_fifo_burst();
  }        
  }
  else if ((temp == 0xD8) & (temp_last == 0xFF))
  {
  is_header = true;
  buffer[i++] = temp_last;
  buffer[i++] = temp;   
  } 
  }
  if (!client.connected()) break;
  }
  }
  void handleNotFound(){
  String message = "Server is running!\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  server.send(200, "text/plain", message);
  Serial.println(message);
  
  
  
  if (server.hasArg("ql")){
  int ql = server.arg("ql").toInt();
  #if defined (OV2640_MINI_2MP) || defined (OV2640_MINI_2MP_PLUS) || defined (OV2640_CAM)
  myCAM.OV2640_set_JPEG_size(ql);
  #elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)  
  myCAM.OV5640_set_JPEG_size(ql);
  #elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
  myCAM.OV5642_set_JPEG_size(ql);
  #endif
  
  Serial.println("QL change to: " + server.arg("ql"));
  }
  }
  void setup() {
  uint8_t vid, pid;
  uint8_t temp;
    //définir le CS comme sortie :
    pinMode(CS,OUTPUT);
    pinMode(CAM_POWER_ON , OUTPUT);
    digitalWrite(CAM_POWER_ON, HIGH);
  #if defined(__SAM3X8E__)
  Wire1.begin();
  #else
  Wire.begin();
  #endif
  Serial.begin(115200);
  Serial.println(F("ArduCAM Start!"));  
  
  // initialise SPI :
  SPI.begin();
  SPI.setFrequency(4000000); //4MHz
  
  //Réinitialiser le CPLD
  myCAM.write_reg(0x07, 0x80);
  delay(100);
  myCAM.write_reg(0x07, 0x00);
  delay(100);
  //Vérifier si le bus ArduCAM SPI est OK
  myCAM.write_reg(ARDUCHIP_TEST1, 0x55);
  temp = myCAM.read_reg(ARDUCHIP_TEST1);
  if (temp != 0x55){
  Serial.println(temp, HEX);
  Serial.println(F("SPI1 interface Error!"));
  while(1);
  }
  
  //Vérifier si le bus ArduCAM SPI est OK
  myCAM.write_reg(ARDUCHIP_TEST1, 0x55);
  temp = myCAM.read_reg(ARDUCHIP_TEST1);
  if (temp != 0x55){
  Serial.println(F("SPI1 interface Error!"));
  while(1);
  }
  #if defined (OV2640_MINI_2MP)|| defined (OV2640_MINI_2MP_PLUS) || defined (OV2640_CAM)
  //Vérifier si le type de module de caméra est OV2640
  myCAM.wrSensorReg8_8(0xff, 0x01);
  myCAM.rdSensorReg8_8(OV2640_CHIPID_HIGH, &vid);
  myCAM.rdSensorReg8_8(OV2640_CHIPID_LOW, &pid);
  if ((vid != 0x26 ) && (( pid != 0x41 ) || ( pid != 0x42 )))
  Serial.println(F("Can't find OV2640 module!"));
  else
  Serial.println(F("OV2640 detected."));
  #elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)
  //Vérifier si le type de module de caméra est OV5640
  myCAM.wrSensorReg16_8(0xff, 0x01);
  myCAM.rdSensorReg16_8(OV5640_CHIPID_HIGH, &vid);
  myCAM.rdSensorReg16_8(OV5640_CHIPID_LOW, &pid);
  if((vid != 0x56) || (pid != 0x40))
  Serial.println(F("Can't find OV5640 module!"));
  else
  Serial.println(F("OV5640 detected."));
  #elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
  //Vérifier si le type de module de caméra est OV5642
  myCAM.wrSensorReg16_8(0xff, 0x01);
  myCAM.rdSensorReg16_8(OV5642_CHIPID_HIGH, &vid);
  myCAM.rdSensorReg16_8(OV5642_CHIPID_LOW, &pid);
  if((vid != 0x56) || (pid != 0x42)){
  Serial.println(F("Can't find OV5642 module!"));
  }
  else
  Serial.println(F("OV5642 detected."));
  #endif
  
  
  //Passez en mode de capture JPEG et initialisez le module OV2640
  myCAM.set_format(JPEG);
  myCAM.InitCAM();
  #if defined (OV2640_MINI_2MP)|| defined (OV2640_MINI_2MP_PLUS) || defined (OV2640_CAM)
  myCAM.OV2640_set_JPEG_size(OV2640_320x240);
  #elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)
  myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);   //VSYNC is active HIGH
  myCAM.OV5640_set_JPEG_size(OV5640_320x240);
  #elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
  myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);   //VSYNC is active HIGH
  myCAM.OV5640_set_JPEG_size(OV5642_320x240);  
  #endif
  
  myCAM.clear_fifo_flag();
  if (wifiType == 0){
  if(!strcmp(ssid,"SSID")){
  Serial.println(F("Please set your SSID"));
  while(1);
  }
  if(!strcmp(password,"PASSWORD")){
  Serial.println(F("Please set your PASSWORD"));
  while(1);
  }
 // Se connecter au réseau Wi-Fi
  Serial.println();
  Serial.println();
  Serial.print(F("Connecting to "));
  Serial.println(ssid);
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(F("."));
  }
  Serial.println(F("WiFi connected"));
  Serial.println("");
  Serial.println(WiFi.localIP());
  }else if (wifiType == 1){
  Serial.println();
  Serial.println();
  Serial.print(F("Share AP: "));
  Serial.println(AP_ssid);
  Serial.print(F("The password is: "));
  Serial.println(AP_password);
  
  WiFi.mode(WIFI_AP);
  WiFi.softAP(AP_ssid, AP_password);
  Serial.println("");
  Serial.println(WiFi.softAPIP());
  }
  
 // Démarre le serveur
  server.on("/capture", HTTP_GET, serverCapture);
  server.on("/stream", HTTP_GET, serverStream);
  server.onNotFound(handleNotFound);
  server.begin();
  Serial.println(F("Server started"));
  }
  void loop() {
      server.handleClient(); 
    }
J'arrive à avoir un flux vidéo / photo avec option de résolution comme la photo suivante :

Il s'agit d'une URL local sur mon PC ( chemin de fichier ) qui récupère les données du flux vidéo via une adresse IP locale ( 192.168.1.26 dans mon cas )
Lorsque je tappe dans mon navigateur : http://192.168.1.26:80, je n'obtiens que l'état du serveur mais pas de flux d'image.
Ma question est la suivante :
Je cherche à afficher ce flux vidéo sur une URL web afin d'y avoir accès de partour et l'intégrer facilement dans un dashboard nodered.
Avez vous une idée de comment m'y prendre ?
Merci,
Ludo