From fd145903dbe5dbbdd8a951797ae1f832e77352b6 Mon Sep 17 00:00:00 2001 From: dreamer Date: Wed, 9 Sep 2020 13:37:04 +0200 Subject: [PATCH] enable micro-rtsp --- src/studioledcam.ino | 61 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/src/studioledcam.ino b/src/studioledcam.ino index ea9eb4a..442f5b2 100644 --- a/src/studioledcam.ino +++ b/src/studioledcam.ino @@ -29,6 +29,12 @@ #include #include +#include "OV2640.h" +#include "SimStreamer.h" +#include "OV2640Streamer.h" +#include "CRtspSession.h" + + #if defined(FASTLED_VERSION) && (FASTLED_VERSION < 3003000) #warning "Requires FastLED 3.3 or later; check github for latest code." #endif @@ -88,6 +94,11 @@ CRGB leds[NUM_LEDS]; #include "wifi.h" #include "web.h" +#define CAMERA_MODEL_AI_THINKER +OV2640 cam; +WiFiServer rtspServer(8554); +CStreamer *streamer; + // wifi ssid and password should be added to a file in the sketch named secrets.h // the secrets.h file should be added to the .gitignore file and never committed or // pushed to public source control (GitHub). @@ -125,6 +136,16 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels) { } } +void setupCam() { + esp32cam_aithinker_config.frame_size = FRAMESIZE_VGA; + // esp32cam_aithinker_config.frame_size = FRAMESIZE_QVGA; + esp32cam_aithinker_config.jpeg_quality = 16; + cam.init(esp32cam_aithinker_config); + rtspServer.begin(); + + streamer = new OV2640Streamer(cam); // our streamer for UDP/TCP based RTP transport +} + void setup() { pinMode(led, OUTPUT); digitalWrite(led, 1); @@ -139,7 +160,7 @@ void setup() { setupWifi(); setupWeb(); - + setupCam(); // Parallel output: 13, 12, 15, 14, FastLED.addLeds(leds, 0, NUM_LEDS_PER_STRIP).setCorrection(TypicalLEDStrip); @@ -188,8 +209,42 @@ void loop() FastLED.show(); // insert a delay to keep the framerate modest - // FastLED.delay(1000 / FRAMES_PER_SECOND); - delay(1000 / FRAMES_PER_SECOND); + FastLED.delay(1000 / FRAMES_PER_SECOND); + // delay(1000 / FRAMES_PER_SECOND); + + + // + // micro-rtsp server section + // + + uint32_t msecPerFrame = 100; + static uint32_t lastimage = millis(); + + // If we have an active client connection, just service that until gone + streamer->handleRequests(0); // we don't use a timeout here, + // instead we send only if we have new enough frames + uint32_t now = millis(); + if(streamer->anySessions()) { + if(now > lastimage + msecPerFrame || now < lastimage) { // handle clock rollover + streamer->streamImage(now); + lastimage = now; + + // check if we are overrunning our max frame rate + now = millis(); + if(now > lastimage + msecPerFrame) { + printf("warning exceeding max frame rate of %d ms\n", now - lastimage); + } + } + } + + WiFiClient rtspClient = rtspServer.accept(); + if(rtspClient) { + Serial.print("client: "); + Serial.print(rtspClient.remoteIP()); + Serial.println(); + streamer->addSession(rtspClient); + } + } void nextPattern()