Below is my code
/*Tech Trends Shameer
//Live Streaming*/
/*
This is a simple MJPEG streaming webserver implemented for AI-Thinker ESP32-CAM and
ESP32-EYE modules.
This is tested to work with VLC and Blynk video widget.
Inspired by and based on this Instructable: $9 RTSP Video Streamer Using the ESP32-CAM Board
(https://www.instructables.com/id/9-RTSP-Video-Streamer-Using-the-ESP32-CAM-Board/)
Board: AI-Thinker ESP32-CAM
*/
#define BLYNK_TEMPLATE_ID "TMPL65f1BmD3D"
#define BLYNK_TEMPLATE_NAME "Live Streaming"
#define BLYNK_AUTH_TOKEN "FY9ZdUCEf9Yktuxn042aKzP8GZB6jm1A"
#define BLYNK_PRINT Serial
#include <Blynk.h>
#include <WiFi.h>
#include <WebServer.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
// Select camera model
//#define CAMERA_MODEL_WROVER_KIT
//#define CAMERA_MODEL_ESP_EYE
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE
#define CAMERA_MODEL_AI_THINKER
#include "camera_pins.h"
#ifndef OV2640_H_
#define OV2640_H_
#include <Arduino.h>
#include <pgmspace.h>
#include <stdio.h>
#include "esp_log.h"
#include "esp_attr.h"
#include "esp_camera.h"
extern camera_config_t esp32cam_config, esp32cam_aithinker_config, esp32cam_ttgo_t_config;
class OV2640
{
public:
OV2640(){
fb = NULL;
};
~OV2640(){
};
esp_err_t init(camera_config_t config);
void run(void);
size_t getSize(void);
uint8_t *getfb(void);
int getWidth(void);
int getHeight(void);
framesize_t getFrameSize(void);
pixformat_t getPixelFormat(void);
void setFrameSize(framesize_t size);
void setPixelFormat(pixformat_t format);
private:
void runIfNeeded(); // grab a frame if we don't already have one
// camera_framesize_t _frame_size;
// camera_pixelformat_t _pixel_format;
camera_config_t _cam_config;
camera_fb_t *fb;
};
#endif //OV2640_H_
char auth[] = BLYNK_AUTH_TOKEN;
const char* ssid = "123";
const char* password = "1313113.";
/*
Next one is an include with wifi credentials.
This is what you need to do:
1. Create a file called "home_wifi_multi.h" in the same folder OR under a separate subfolder of the "libraries" folder of Arduino IDE. (You are creating a "fake" library really - I called it "MySettings").
2. Place the following text in the file:
#define SSID1 "replace with your wifi ssid"
#define PWD1 "replace your wifi password"
3. Save.
Should work then
*/
//#include "home_wifi_multi.h"
OV2640 cam;
WebServer server(80);
const char HEADER[] = "HTTP/1.1 200 OK\r\n" \
"Access-Control-Allow-Origin: *\r\n" \
"Content-Type: multipart/x-mixed-replace; boundary=123456789000000000000987654321\r\n";
const char BOUNDARY[] = "\r\n--123456789000000000000987654321\r\n";
const char CTNTTYPE[] = "Content-Type: image/jpeg\r\nContent-Length: ";
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(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(F("."));
}
ip = WiFi.localIP();
Serial.println(F("WiFi connected"));
Serial.println("");
// Configure Blynk
Blynk.config(auth);
Serial.println("Connecting to Blynk");
while (Blynk.connect() == false) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to Blynk");
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();
Blynk.run();
}
c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/…/lib/gcc/xtensa-esp32-elf/12.2.0/…/…/…/…/xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\AppData\Local\Temp\arduino\sketches\0C72AFDE6E536486EDF4CB3B1DE16AF6\sketch\live-streaming.ino.cpp.o:(.literal._Z17handle_jpg_streamv+0x1c): undefined reference to OV2640::run()' c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/../lib/gcc/xtensa-esp32-elf/12.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\AppData\Local\Temp\arduino\sketches\0C72AFDE6E536486EDF4CB3B1DE16AF6\sketch\live-streaming.ino.cpp.o:(.literal._Z17handle_jpg_streamv+0x20): undefined reference to
OV2640::getSize()’
c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/…/lib/gcc/xtensa-esp32-elf/12.2.0/…/…/…/…/xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\AppData\Local\Temp\arduino\sketches\0C72AFDE6E536486EDF4CB3B1DE16AF6\sketch\live-streaming.ino.cpp.o:(.literal._Z17handle_jpg_streamv+0x28): undefined reference to OV2640::getfb()' c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/../lib/gcc/xtensa-esp32-elf/12.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\AppData\Local\Temp\arduino\sketches\0C72AFDE6E536486EDF4CB3B1DE16AF6\sketch\live-streaming.ino.cpp.o:(.literal._Z5setupv+0x54): undefined reference to
OV2640::init(camera_config_t)’
c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/…/lib/gcc/xtensa-esp32-elf/12.2.0/…/…/…/…/xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\AppData\Local\Temp\arduino\sketches\0C72AFDE6E536486EDF4CB3B1DE16AF6\sketch\live-streaming.ino.cpp.o: in function handle_jpg_stream()': C:\Users\yewki\Downloads\live-video-streaming-esp32-cam-blynk-iot\live-streaming/live-streaming.ino:126: undefined reference to
OV2640::run()’
c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/…/lib/gcc/xtensa-esp32-elf/12.2.0/…/…/…/…/xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\Downloads\live-video-streaming-esp32-cam-blynk-iot\live-streaming/live-streaming.ino:127: undefined reference to OV2640::getSize()' c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/../lib/gcc/xtensa-esp32-elf/12.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\Downloads\live-video-streaming-esp32-cam-blynk-iot\live-streaming/live-streaming.ino:131: undefined reference to
OV2640::getfb()’
c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/…/lib/gcc/xtensa-esp32-elf/12.2.0/…/…/…/…/xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\AppData\Local\Temp\arduino\sketches\0C72AFDE6E536486EDF4CB3B1DE16AF6\sketch\live-streaming.ino.cpp.o: in function handle_jpg()': C:\Users\yewki\Downloads\live-video-streaming-esp32-cam-blynk-iot\live-streaming/live-streaming.ino:145: undefined reference to
OV2640::run()’
c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/…/lib/gcc/xtensa-esp32-elf/12.2.0/…/…/…/…/xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\Downloads\live-video-streaming-esp32-cam-blynk-iot\live-streaming/live-streaming.ino:149: undefined reference to OV2640::getfb()' c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/../lib/gcc/xtensa-esp32-elf/12.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\Downloads\live-video-streaming-esp32-cam-blynk-iot\live-streaming/live-streaming.ino:149: undefined reference to
OV2640::getSize()’
c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/…/lib/gcc/xtensa-esp32-elf/12.2.0/…/…/…/…/xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\AppData\Local\Temp\arduino\sketches\0C72AFDE6E536486EDF4CB3B1DE16AF6\sketch\live-streaming.ino.cpp.o: in function setup()': C:\Users\yewki\Downloads\live-video-streaming-esp32-cam-blynk-iot\live-streaming/live-streaming.ino:204: undefined reference to
OV2640::init(camera_config_t)’
collect2.exe: error: ld returned 1 exit status
exit status 1
Compilation error: exit status 1
It shows several red lines saying that I have undefined reference to _. Please help. Thank you in advance