Dans ce tutoriel, vous apprendrez comment diffuser une vidéo depuis un Seeed Studio XIAO-ESP32-S3 Sense via votre réseau Wi-Fi local vers votre navigateur Web. Cela vous permet de créer votre propre système de caméra de surveillance sans fil que vous pouvez surveiller depuis votre ordinateur.
Si vous n’avez jamais utilisé le XIAO-ESP32-S3 Sense auparavant, consultez d’abord le Getting started with XIAO-ESP32-S3-Sense tutoriel qui vous aidera à démarrer avec la carte.
Pièces requises
Évidemment, vous aurez besoin d’une carte XIAO-ESP32-S3 Sense de Seeed Studio pour tester les exemples de code. Notez que la carte peut devenir très chaude, par exemple lors de la diffusion vidéo à un taux de rafraîchissement élevé. Je vous recommande d’attacher un petit Heatsink à l’arrière de la carte (voir la pièce listée ci-dessous).

Seeed Studio XIAO ESP32 S3 Sense

Câble USB C

Petit dissipateur thermique 9×9 mm
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Diffusion vidéo
Dans ce projet, nous allons implémenter un serveur de streaming vidéo qui fonctionne sur le XIAO-ESP32-S3 Sense. La caméra du XIAO-ESP32-S3 Sense capture des images et les diffuse via le Wi-Fi. Le routeur Wi-Fi transmet ces images au navigateur Web de votre PC, qui les affiche sous forme de flux vidéo. L’image ci-dessous illustre l’architecture du système :

Notez que le flux vidéo n’est ni chiffré ni sécurisé, mais sera uniquement visible via une URL au sein de votre réseau Wi-Fi local, par exemple 192.168.2.40/stream. Seules les personnes ayant accès à votre réseau Wi-Fi pourront voir le flux vidéo.
Code pour un serveur de streaming vidéo avec XIAO-ESP32-S3-Sense
La Getting Started Wiki by Seeed Studio pour XIAO-ESP32-S3-Sense fournit de nombreuses informations sur la carte et inclut également un exemple de code pour un serveur de streaming vidéo. Cependant, ce code est plus complexe que celui présenté ci-dessous.
La simplification est en grande partie due à la bibliothèque esp32cam, que vous pouvez installer via le Library Manager dans l’IDE Arduino. Il suffit de chercher « esp32cam » et de cliquer sur INSTALL. L’image ci-dessous montre l’installation terminée :

Vous trouverez ci-dessous le code complet pour le serveur de streaming vidéo, qui utilise la bibliothèque esp32cam. Jetez-y un coup d’œil rapide, puis nous en discuterons en détail :
#include "WebServer.h"
#include "WiFi.h"
#include "esp32cam.h"
const char* WIFI_SSID = "SSID";
const char* WIFI_PASS = "PASSWORD";
const char* URL = "/stream";
const auto RESOLUTION = esp32cam::Resolution::find(800, 600);
const int FRAMERATE = 10;
WebServer server(80);
void handleStream() {
static char head[128];
WiFiClient client = server.client();
server.sendContent("HTTP/1.1 200 OK\r\n"
"Content-Type: multipart/x-mixed-replace; "
"boundary=frame\r\n\r\n");
while (client.connected()) {
auto frame = esp32cam::capture();
if (frame) {
sprintf(head,
"--frame\r\n"
"Content-Type: image/jpeg\r\n"
"Content-Length: %ul\r\n\r\n",
frame->size());
client.write(head, strlen(head));
frame->writeTo(client);
client.write("\r\n");
delay(1000 / FRAMERATE);
}
}
}
void initCamera() {
using namespace esp32cam;
Config cfg;
cfg.setPins(pins::XiaoSense);
cfg.setResolution(RESOLUTION);
cfg.setBufferCount(2);
cfg.setJpeg(80);
Camera.begin(cfg);
}
void initWifi() {
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
}
Serial.printf("Stream at: http://%s%s\n",
WiFi.localIP().toString().c_str(), URL);
}
void initServer() {
server.on(URL, handleStream);
server.begin();
}
void setup() {
Serial.begin(115200);
initWifi();
initCamera();
initServer();
}
void loop() {
server.handleClient();
}
Bibliothèques
Le sketch commence par inclure les bibliothèques nécessaires :
#include "WebServer.h" #include "WiFi.h" #include "esp32cam.h"
Ces bibliothèques permettent la fonctionnalité de serveur HTTP (WebServer.h), la connectivité Wi-Fi (WiFi.h) et le contrôle de la caméra via la bibliothèque esp32cam.
Constantes
Ensuite, nous définissons des constantes pour les paramètres Wi-Fi et caméra :
const char* WIFI_SSID = "SSID"; const char* WIFI_PASS = "PASSWORD"; const char* URL = "/stream"; const auto RESOLUTION = esp32cam::Resolution::find(800, 600); const int FRAMERATE = 10;
Les variables WIFI_SSID et WIFI_PASS stockent les identifiants du réseau Wi-Fi. Vous devrez remplacer SSID et PASSWORD par les informations réelles de votre réseau Wi-Fi.
La variable URL est le chemin sur lequel le flux vidéo sera diffusé. Vous pouvez le changer comme vous le souhaitez. Par exemple, « /video » ou « /frontdoo« , assurez-vous simplement de garder la barre oblique (‘/’) au début.
La variable RESOLUTION définit la résolution souhaitée pour la caméra. Voici une liste des résolutions possibles, bien que selon la caméra, toutes ne fonctionnent pas forcément :
- 96×96
- 160×120
- 128×128
- 176×144
- 240×176
- 240×240
- 320×240
- 320×320
- 400×296
- 480×320
- 640×480
- 800×600
- 1024×768
- 1280×720
- 1280×1024
- 1600×1200
La variable FRAMERATE définit le nombre d’images par seconde envoyées au client. Cela vous permet de ralentir le flux vidéo et d’éviter la surchauffe de la carte. Si vous réglez un taux trop élevé, il sera automatiquement limité à ce que l’ESP32 peut fournir pour la résolution de caméra spécifique.
Objets
La ligne suivante crée l’objet serveur HTTP qui écoute sur le port 80. C’est notre serveur web qui fournit le flux vidéo.
WebServer server(80);
handleStream
La fonction handleStream() gère le flux vidéo chaque fois qu’un client accède au chemin /stream :
void handleStream() {
static char head[128];
WiFiClient client = server.client();
Cette ligne récupère le client actuellement connecté au serveur. La réponse est ensuite préparée :
server.sendContent("HTTP/1.1 200 OK\r\n"
"Content-Type: multipart/x-mixed-replace; "
"boundary=frame\r\n\r\n");
Cet en-tête indique au navigateur qu’il recevra un flux MJPEG multipart, où chaque partie est séparée par une frontière appelée frame.
Dans la boucle, la fonction capture d’abord une image de la caméra :
while (client.connected()) {
auto frame = esp32cam::capture();
Si une image est capturée avec succès, un en-tête décrivant l’image JPEG est construit et envoyé au client:
if (frame) {
sprintf(head,
"--frame\r\n"
"Content-Type: image/jpeg\r\n"
"Content-Length: %ul\r\n\r\n",
frame>size());
client.write(head, strlen(head));
frame->writeTo(client);
client.write("\r\n");
}
initCamera
La fonction initCamera() configure et démarre la caméra :
void initCamera() {
using namespace esp32cam;
Config cfg;
cfg.setPins(pins::XiaoSense);
cfg.setResolution(RESOLUTION);
cfg.setBufferCount(2);
cfg.setJpeg(80);
Camera.begin(cfg);
}
D’abord, un objet Config est créé. La fonction setPins configure les broches de la caméra selon la carte XIAO-ESP32-S3 Sense. Voir le pin configurations des autres cartes supportées.
setResolution définit la résolution à utiliser, tandis que setBufferCount détermine le nombre de tampons d’image utilisés en interne, ce qui peut aider à obtenir des taux de rafraîchissement plus rapides.
La fonction setJpeg règle la qualité de compression JPEG entre 0 et 100. 80 est un bon compromis entre qualité et taille. 90 offre une meilleure qualité mais une réduction de taille moindre. Pour un streaming plus rapide, vous pouvez réduire la résolution et la compression JPEG, mais vous obtiendrez évidemment des images plus petites avec une qualité inférieure.
Enfin, Camera.begin(cfg) initialise la caméra avec ces paramètres.
initWifi
La fonction initWifi() connecte la carte XIAO-ESP32-S3 Sense au réseau Wi-Fi spécifié :
void initWifi() {
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
}
Serial.printf("Stream at: http://%s%s\n",
WiFi.localIP().toString().c_str(), URL);
}
WiFi.persistent(false) désactive l’écriture des identifiants en mémoire flash, ce qui accélère la reconnexion. L’appareil est configuré en station mode (WIFI_STA), et tente de se connecter au Wi-Fi avec les identifiants fournis.
Une fois connecté, l’adresse IP et le chemin du flux sont affichés dans le moniteur série. Vous devrez copier-coller cette URL affichée dans la barre d’adresse de votre navigateur pour voir le flux vidéo. L’URL réelle dépendra de votre carte, mais vous pouvez changer le suffixe « stream ». Pour ma carte, voici l’URL affichée dans le moniteur série :

Je copie donc « http://192.168.2.40/stream » dans la barre d’adresse de mon navigateur Chrome pour accéder à la vidéo.
initServer
La fonction initServer() associe le chemin de streaming au gestionnaire et démarre le serveur :
void initServer() {
server.on(URL, handleStream);
server.begin();
}
Cela mappe toute requête vers /stream à la fonction handleStream(), puis démarre le serveur.
setup
La fonction setup() démarre la communication série, connecte au Wi-Fi, initialise la caméra et configure le serveur web :
void setup() {
Serial.begin(115200);
initWifi();
initCamera();
initServer();
}
loop
Enfin, la fonction loop() gère en continu les requêtes HTTP entrantes :
void loop() {
server.handleClient();
}
Cette ligne permet au XIAO-ESP32-S3 Sense de répondre aux requêtes clients en invoquant les gestionnaires enregistrés tels que handleStream().
Dans l’ensemble, ce code crée un serveur de streaming MJPEG simple mais efficace, accessible depuis n’importe quel navigateur web sur le même réseau, fournissant un flux vidéo en direct depuis le XIAO-ESP32-S3 Sense.
Pour télécharger ce code sur votre XIAO-ESP32-S3 Sense, sélectionnez la carte XIAO_ESP32S3 et appuyez sur le bouton de téléchargement.

XIAO_ESP32S3 comme carteSi vous avez besoin d’aide supplémentaire, consultez le Getting started with XIAO-ESP32-S3-Sense tutoriel.
Conclusions
Dans ce tutoriel, vous avez appris à diffuser une vidéo depuis un XIAO-ESP32-S3 Sense via votre réseau Wi-Fi local vers votre navigateur Web.
Si vous souhaitez détecter des objets dans le flux vidéo, consultez le Object Detection with ESP32-CAM and YOLO tutoriel. Il est écrit pour l’ESP32-CAM mais nécessite seulement un petit changement (cfg.setPins(pins::XiaoSense)) pour fonctionner avec le XIAO-ESP32-S3 Sense.
De même, le Surveillance Camera with ESP32-CAM tutoriel vous montre comment enregistrer des flux vidéo déclenchés par mouvement dans un fichier.
Si vous avez des questions, n’hésitez pas à les poser dans la section des commentaires.
Bon bricolage ; )

