首页 > 编程知识 正文

n2n内网穿透(esp32视频教程)

时间:2023-05-04 14:07:41 阅读:76956 作者:1517

esp32 cam 1、esp32视频2、内部网透明3、视频显示

注意:这篇文章只是自学的,内部网的透明延迟很高,所以选择更好的网络服务器来减少延迟。

esp32 cam视频传输一般只能在局域网中传输,不能在广域网中传输。 通过内部网实现广域网显示,也可以用手机4G显示。

1、esp32视频

来源:博客。 虽然这个功能相对于拥有那个照相机的样本代码是单一的,但是可以充分使用。

# include ' esp _ camera.h ' # include wifi.h # include ' esp _ timer.h ' # include ' img _ converters.h ' disablebrownoutproblems # include ' esp _ http _ service replacewithyournetworkcredentialsconstchar * ssid=' tsy _ b5ac 58 //wfi帐户const char* password='12345678 '; # define part _ boundary ' 123456789000000000987654321 (/thisprojectwastestedwitheaithinkermodel, m5stackpsrammodelandm5stackwithoutpsram # define camera _ model _ ai _ thinker//# define camera _ model _ m5stack _ PS RS nottestedwiththismodel//# define camera _ model _ wr over _ kit # dfinepwdn _ gpio _ num-1 # define reset _ gpio _ nu n defines iod _ num 26 define y8 _ gpio _ num 34 # definey7_ gpio _ num 39 # definey6_ gpio _ num 36 # definey5_ gpio _ nu m define vsync _ gpio _ num 25 # define href _ gpio _ num 23 # define pclk _ gpio _ num 22 # elifdefine efinepwdn _ gpio _ nu n defines iod _ gpio _ num 25 # defines iod _ gpio _ num 25 define y8 _ gpio _ num 36 # definey7_ gpio _ nu M18 # definey6_ gio definey4_ gpio define y2 _ gpio _ num 32 # define vsync _ gpio _ num 22 # define href _ gpio _ num 26 # define pclk _ gpio _ nu m 26 define reset _ gpio _ num 15 # definexclk _ gpio _ num 27 # defines iod _ gpio _ num 25 # defines iod _ gpio _ nu m 25 define y8

#define Y5_GPIO_NUM 5 #define Y4_GPIO_NUM 34 #define Y3_GPIO_NUM 35 #define Y2_GPIO_NUM 17 #define VSYNC_GPIO_NUM 22 #define HREF_GPIO_NUM 26 #define PCLK_GPIO_NUM 21#elif defined(CAMERA_MODEL_AI_THINKER) #define PWDN_GPIO_NUM 32 #define RESET_GPIO_NUM -1 #define XCLK_GPIO_NUM 0 #define SIOD_GPIO_NUM 26 #define SIOC_GPIO_NUM 27 #define Y9_GPIO_NUM 35 #define Y8_GPIO_NUM 34 #define Y7_GPIO_NUM 39 #define Y6_GPIO_NUM 36 #define Y5_GPIO_NUM 21 #define Y4_GPIO_NUM 19 #define Y3_GPIO_NUM 18 #define Y2_GPIO_NUM 5 #define VSYNC_GPIO_NUM 25 #define HREF_GPIO_NUM 23 #define PCLK_GPIO_NUM 22#else #error "Camera model not selected"#endifstatic const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;static const char* _STREAM_BOUNDARY = "rn--" PART_BOUNDARY "rn";static const char* _STREAM_PART = "Content-Type: image/jpegrnContent-Length: %urnrn";httpd_handle_t stream_httpd = NULL;static esp_err_t stream_handler(httpd_req_t *req){ camera_fb_t * fb = NULL; esp_err_t res = ESP_OK; size_t _jpg_buf_len = 0; uint8_t * _jpg_buf = NULL; char * part_buf[64]; res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE); if(res != ESP_OK){ return res; } while(true){ fb = esp_camera_fb_get(); if (!fb) { Serial.println("Camera capture failed"); res = ESP_FAIL; } else { if(fb->width > 400){ if(fb->format != PIXFORMAT_JPEG){ bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len); esp_camera_fb_return(fb); fb = NULL; if(!jpeg_converted){ Serial.println("JPEG compression failed"); res = ESP_FAIL; } } else { _jpg_buf_len = fb->len; _jpg_buf = fb->buf; } } } if(res == ESP_OK){ size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len); res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen); } if(res == ESP_OK){ res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len); } if(res == ESP_OK){ res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY)); } if(fb){ esp_camera_fb_return(fb); fb = NULL; _jpg_buf = NULL; } else if(_jpg_buf){ free(_jpg_buf); _jpg_buf = NULL; } if(res != ESP_OK){ break; } //Serial.printf("MJPG: %uBn",(uint32_t)(_jpg_buf_len)); } return res;}void startCameraServer(){ httpd_config_t config = HTTPD_DEFAULT_CONFIG(); config.server_port = 80; httpd_uri_t index_uri = { .uri = "/", .method = HTTP_GET, .handler = stream_handler, .user_ctx = NULL }; //Serial.printf("Starting web server on port: '%d'n", config.server_port); if (httpd_start(&stream_httpd, &config) == ESP_OK) { httpd_register_uri_handler(stream_httpd, &index_uri); }}void setup() { WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector Serial.begin(115200); Serial.setDebugOutput(false); 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; if(psramFound()){ config.frame_size = FRAMESIZE_UXGA; config.jpeg_quality = 10; config.fb_count = 2; } else { config.frame_size = FRAMESIZE_SVGA; config.jpeg_quality = 12; config.fb_count = 1; } // Camera init esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x", err); return; } // Wi-Fi connection WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.print("Camera Stream Ready! Go to: http://"); Serial.print(WiFi.localIP()); // Start streaming web server startCameraServer();}void loop() { delay(1);}

烧录:

2、内网穿透

  我使用了飞鸽内网穿透,飞鸽官网。注册账号,个人中心。建议选择限速3M那个,因为要进行视频传输,速率低无法加载成功。


下载客户端:

隧道管理,开启服务器。

复制启动命令:

打开下载的Win 客户端,填入复制的启动命令

3、视频查看

  强烈建议 使用谷歌浏览器,这是个坑,我开始的时候使用Microsoft Edge 浏览器,无法获取到数据。在手机测试的适合也建议使用谷歌浏览器。
浏览器输入飞鸽后台那个访问网址:

视频传输延迟还是比较大的,内网穿透算是成功了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。