Video streaming with ESP32-CAM

Now I’m trying to make a streaming camera with ESP32-CAM (AI thinker), which transmits movie data only while I’m checking the video on the Blynk app to save battery. The questions are

  1. Is using “Video streaming” gadget appropriate for this purpose? Doesn’t ESP32-CAM always submits movie data, regardless of whether I’m looking it through the gadget or not? If so, are there any alternative ways to archive the conditions above?

  2. I have successfully gotten the movie with following code by directly connecting the IP address from my PC, but my video streaming gadget doesn’t catch the data. I just set the IP address in the “URL ADDRESS” window in “Video streaming settings”. Is there anything else to be done?

I am quite new to Blynk, so might made silly questions, but would appreciate it if you could answer.

#include "src/OV2640.h"
#include <WiFi.h>
#include <WebServer.h>
#include <WiFiClient.h>
#include "camera_pins.h"
#define CAMERA_MODEL_AI_THINKER
#define SSID1 "xxxxxxxx"
#define PWD1 "xxxxxxxx"


OV2640 cam;

WebServer server(80);

const char HEADER[] = "xxx";
const char BOUNDARY[] = "xxx";
const char CTNTTYPE[] = "xxx ";
const int hdrLen = strlen(HEADER);
const int bdrLen = strlen(BOUNDARY);
const int cntLen = strlen(CTNTTYPE);

void handle_jpg_stream(void)
{
 char buf[32];
 int s;
 WiFiClient client = server.client();
 client.write(HEADER, hdrLen);
 client.write(BOUNDARY, bdrLen);

 while (true)
 {
   if (!client.connected()) break;
   cam.run();
   s = cam.getSize();
   client.write(CTNTTYPE, cntLen);
   sprintf( buf, "%d\r\n\r\n", s );
   client.write(buf, strlen(buf));
   client.write((char *)cam.getfb(), s);
   client.write(BOUNDARY, bdrLen);
 }
}

const char JHEADER[] = "HTTP/1.1 200 OK\r\n" \
                      "Content-disposition: inline; filename=capture.jpg\r\n" \
                      "Content-type: image/jpeg\r\n\r\n";
const int jhdLen = strlen(JHEADER);

void handle_jpg(void)
{
 WiFiClient client = server.client();

 cam.run();
 if (!client.connected()) return;

 client.write(JHEADER, jhdLen);
 client.write((char *)cam.getfb(), cam.getSize());
}

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);
}

void setup()
{

 Serial.begin(115200);
 //while (!Serial);            //wait for serial connection.

 camera_config_t config;
 config.ledc_channel = LEDC_CHANNEL_0;
 config.ledc_timer = LEDC_TIMER_0;
 config.pin_d0 = Y2_GPIO_NUM;
 config.pin_d1 = Y3_GPIO_NUM;
 config.pin_d2 = Y4_GPIO_NUM;
 config.pin_d3 = Y5_GPIO_NUM;
 config.pin_d4 = Y6_GPIO_NUM;
 config.pin_d5 = Y7_GPIO_NUM;
 config.pin_d6 = Y8_GPIO_NUM;
 config.pin_d7 = Y9_GPIO_NUM;
 config.pin_xclk = XCLK_GPIO_NUM;
 config.pin_pclk = PCLK_GPIO_NUM;
 config.pin_vsync = VSYNC_GPIO_NUM;
 config.pin_href = HREF_GPIO_NUM;
 config.pin_sscb_sda = SIOD_GPIO_NUM;
 config.pin_sscb_scl = SIOC_GPIO_NUM;
 config.pin_pwdn = PWDN_GPIO_NUM;
 config.pin_reset = RESET_GPIO_NUM;
 config.xclk_freq_hz = 20000000;
 config.pixel_format = PIXFORMAT_JPEG;

 // Frame parameters
 //  config.frame_size = FRAMESIZE_UXGA;
 config.frame_size = FRAMESIZE_QVGA;
 config.jpeg_quality = 12;
 config.fb_count = 2;

#if defined(CAMERA_MODEL_ESP_EYE)
 pinMode(13, INPUT_PULLUP);
 pinMode(14, INPUT_PULLUP);
#endif

 cam.init(config);

 IPAddress ip;

 WiFi.mode(WIFI_STA);
 WiFi.begin(SSID1, PWD1);
 while (WiFi.status() != WL_CONNECTED)
 {
   delay(500);
   Serial.print(F("."));
 }
 ip = WiFi.localIP();
 Serial.println(F("WiFi connected"));
 Serial.println("");
 Serial.println(ip);
 Serial.print("Stream Link: http://");
 Serial.print(ip);
 Serial.println("/mjpeg/1");
 server.on("/mjpeg/1", HTTP_GET, handle_jpg_stream);
 server.on("/jpg", HTTP_GET, handle_jpg);
 server.onNotFound(handleNotFound);
 server.begin();
}

void loop()
{
 server.handleClient();
}

Are you using the video streaming widget in Blynk IoT or Blynk Legacy?
Which Blynk app version and mobile OS are you using (iOS or Android)?

(BTW, you are asked to provide this info when you create a new “Need help…” topic, providing it in your first post would help us to help you, and result in a speedier response from the community).

Pete.

Thank you for your reply, and very sorry for the lack of information.

Are you using the video streaming widget in Blynk IoT or Blynk Legacy?
Blynk IoT.

Which Blynk app version and mobile OS are you using (iOS or Android)?
version 1.6.3 (94) with Android.

With Blynk IoT, your video stream needs to be a publicly resolvable URL, so you will need to do some port forwarding in your router, and use a DDNS service along with a DDNS updater if you don’t have a static public IP address.

Pete.

Thank you, I see.
Are there any other way to check the video via ESP32-CAM and Blynk IoT?
All of the information I checked was with the legacy one.

I don’t really understand the question.

Pete.

Now I’m trying to receive the video data from the camera by the video streaming gadget, but as you told me, it will needs port forwarding.
If I can’t port forward, are there any alternative way to see the video from the camera on Blynk IoT by using other gadgets?

1 Like