# simpleVideoServer **Repository Path**: yunyizhi/simpleVideoServer ## Basic Information - **Project Name**: simpleVideoServer - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 12 - **Forks**: 2 - **Created**: 2024-10-29 - **Last Updated**: 2025-05-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SimpleVideoServer 该项目仅仅是LightServer的一个模块,早期单独开源出来。现有功能更加完善的esp32摄像头方案 => [LightCam](https://gitee.com/yunyizhi/light-nodes/tree/master/LightCam) 支持摄像头更多设置操作。 CameraWebServer 的demo使用esp32cam自己提供http服务和视频流,会有较大性能开销。而且需要内网穿透才能外网访问。本项目提供服务端合成视频流的方式,esp32cam只需要不停拍照发送给服务端,服务端处理浏览器查看视频的请求,合成视频流给浏览器。 我们可以把服务端程序部署在公网,便可可以通过这样的方式远程访问。 劝退提醒,云服务器并不便宜,便宜的带宽如果只有1~2M, 除8 得到实际带宽不足以传大图,本人测试传HVGA分辨率的图,http下载的速度也能达到三百甚至四百KB每秒。当然你可以降低画质,或者降低帧率。 当然你有条件内网穿透也行。 ```mermaid graph LR e(esp32cam) e1(esp32cam1) e2(合宙esp32S3) S(SimpleVideoServer) e -->|帧|S e1 -->|帧|S e2 -->|帧|S B(浏览器) B2(浏览器2) S -->|mjpeg视频通道1|B S -->|mjpeg视频通道2|B S -->|mjpeg视频通道3|B S -->|mjpeg视频通道3|B2 ``` 本项目提供了,服务端代码与esp32cam(或合宙ESP32S3)的代码。 :file_folder: `simpleVideoRecorder` 目录下载为esp32cam(或合宙ESP32S3)的代码。 _如果支持该项目,请点star ⭐ 而不是 关注通知,后者只会让你收到关于该项目的动态的邮件通知。_ ### 本人其他摄像头方案 ##### 1.[ffmpeg/video · 云逸之/espressif-demo ](https://gitee.com/yunyizhi/espressif-demo/tree/master/ffmpeg/video) 将jpeg发给ffmpeg以h.264通过rtp推送,可以一定程度减少带宽占用 ```mermaid graph LR esp32[esp32] ffmpeg[ffmpeg] vlc[vlc] esp32 -->|"mjpeg over udp"|ffmpeg ffmpeg-->|"rtp h.264"|vlc ``` 支持 * esp32cam * 合宙esp32s3 * esp32-wrover-cam * ESP32-S3 WROOM N16R8 CAM 附视频录制方法。 ##### 2.[usb_camera · 云逸之/espressif-demo ](https://gitee.com/yunyizhi/espressif-demo/tree/master/usb_camera) esp32s2/esp32s3 驱动usb摄像头将jpeg发给ffmpeg以h.264通过rtp推送。 esp32s2/s3的usb只占用两个io,可以节省大量引脚。 可以使用价格约10元的esp32s2 mini实现视频功能。需要结合乐鑫官方店的usb摄像头。 附视频录制方法。 ##### 3.[LigthUsbCam · 云逸之/LightNodes ](https://gitee.com/yunyizhi/light-nodes/tree/master/LigthUsbCam) esp32s2/esp32s3 驱动usb摄像头 推mjpeg 给light server或者 lightHandle。硬件与第二项相同。 ##### 4.[LightCam · 云逸之/LightNodes ](https://gitee.com/yunyizhi/light-nodes/tree/master/LightCam) 支持 五款esp32开发板推mjpeg 给light server或者 lightHandle,已更新接入服务,遇到临时信号中断,控制通道可以在网络正常时自愈。 - esp32cam - 合宙esp32s3 - esp32-wrover-cam - Freenove ESP32-S3-WROOM Board 某宝叫做 ESP32-S3 WROOM N16R8 CAM - Seeed Studio XIAO ESP32S3 以上esp32均使用mjpeg over udp发送,可正常被ffmepg处理。如果需要处理视频流,也可以直接从esp32推,发送端可参考`1` `2`项。 如果需要推到直播平台如B站,可以使用ffmepg推送。 ## 运行服务端 根据自己需要选择以下任意方式运行服务端 * 下载 [windows服务端发行版 0.0.3.1](https://gitee.com/yunyizhi/simpleVideoServer/releases/download/v0.1/win_release_0.0.3.1.zip) 解压之后,进入对应目录点击run.bat文件启动服务器。 * 下载[linux服务端发行版](https://gitee.com/yunyizhi/simpleVideoServer/releases/download/v0.1/linux_release_0.0.3.1.tar.gz) 需要unzip或p7z等可以解压zip的应用 运行 ```shell tar -zxvf linux_release_0.0.3.1.tar.gz cd linux_release/ sh run.sh ``` * 发行版内部仅仅是一些java17 版本的class文件和jre以及启动脚本,你也可以使用任意其它的jre17运行这些class文件。并非需要发行版。 > 比如你希望在macos运行当前服务端时,将macos的jdk17或者jre17复制到linux发行版的目录中,替代其jre目录,参考run.sh中命令调用jre下java运行服务端。 * 访问视频服务 每个摄像头处在不同频道,访问不同的摄像头需要不同的地址。 但这个版本没有测试多频道,只能说理论上没有问题。 如鄙人执行的服务端日志打印含有esp32Cam接入的后的相关打印如下: ```tex D:\Users\immor\idea\SimpleVideoServer\out\win_release>.\jre\bin\java -classpath SimpleVideoServer org.btik.server.video.UDP2Main ----- version:0.0.3 ----- [gitcode page] => https://gitcode.net/qq_26700087/simpleVideoServer snChannelBinderPort:[TCP] 8004 binder stared init buffer pool start dispatchers dispatcherPoolSize: 8 frameDelayTimeout: 3000 streamPort:[UDP] 8004 bufferPoolSize:500 udp channel loaded httpPort:[TCP] 8003 bio video server started Channel /7CDFA1FA0F08 is online http://127.0.0.1:8003/video/7CDFA1FA0F08 http://192.168.0.110:8003/video/7CDFA1FA0F08 http://192.168.137.1:8003/video/7CDFA1FA0F08 ``` 每接入一个摄像头会新建一个频道,在`Channel /{mac地址} is online:`的打印后会出现,相关可以访问视频流的地址。 video后为通道地址,为设备的mac地址不含分隔符十六进制大写的字符串。 这个时候其实只是获取了设备的通道索引,并非开始传图片。 如果供电不足,还需要等待足够长的时间,特别是合宙ESP32S3,在供电不足情况下,可能需要等待数分钟视频才稳定。 这些地址是获取网卡上的ip拼接成http地址。如果是云服务器,其公网ip并非在网卡上。 **部署在云服务器的同学把端口打开(需要开放安全组的端口见后文配置项相关说明)后,需要把内网ip替换成公网ip,或者域名即可**。 简单得说就是控制台打印了 http://127.0.0.1:8003/video/7CDFA1FA0F08 替换成 http://公网ip或域名:8003/video/7CDFA1FA0F08 每次esp32重新启动接入服务器都会打印`Channel /{mac地址} is online: `如果反复打印,可以看看是否接触不良。 * 关于如何把视频界面嵌入其它网页 如果你擅长web开发,或者不喜欢在多个窗口查看多个摄像头可以参考以下方法增加自己的内容。 本视频流是允许跨域的,若希望在自己的网页里面加入本服务端提供esp32Cam视频窗口, 其实不用html的 `iframe`标签,`img`标签即可。 比如以下html代码,新建一个文件比如`a.html` 复制以下内容,根据实际情况,替换`img`标签`src`属性的内容。 ```html 直播间
``` 以上是我的两个esp32Cam的视野,效果如下: ![esp32Cam doublevideo](https://foruda.gitee.com/images/1730181180403554936/f022fe58_12283368.gif) 也就是说,你可以把该项目植入任何其它可以用到web前端的项目。通过查询在线设备,可以动态打开每个摄像头的视频。 ## 配置项 `light-video.properties` ```properties http.port=8003 stream.port=8004 stream.bind.port=8004 http.video.so.send.timeout=300 frame.delay.skip.timeout=3000 udp.video.buffer.pool.size=500 udp.video.dispatcher.thread.size=8 udp.video.channel.size=128 ``` **http.port** 为http的端口 **TCP端口 公网时需要开放该端口**。 **stream.port** esp32向服务端发送照片的端口 ,一般无需修改,修改则同步修改esp32中对应 的。**UDP端口 公网时需要开放该端口**。 **stream.bind.port** esp32 获取通道索引的端口 **TCP端口 公网时需要开放该端口**。 **http.video.so.send.timeout** http发送超时,检查周期为100毫秒,默认300毫秒,如果将超时改得太小了,会受到检测周期的影响,但可以改大。 **frame.delay.skip.timeout** 接收esp32图片快于发给浏览器速度时,会造成图片积压,延时会逐步累积,当某帧图片接收和处理的延时超过当前阈值之后,丢弃该帧 **udp.video.buffer.pool.size** udp帧缓存池大小, 会固定占用一部分内存反复使用 **udp.video.dispatcher.thread.size** 分发线程数量,不是越多越好,目前不建议改大,因为当前mjpeg的带宽负载的压力根本无法在公网接大量摄像头,访问视频用户多也会同样占用带宽。 **udp.video.channel.size** 视频通道数量,会限制接入的数量,每个通道的索引在esp32接入的时候获取,该值不能超过255。并非同时在线数量,而是总设备数量,即是无其它设备在线,总数量用完,新的摄像头也无法接入。服务器重启后,则会重置,则需要esp32重启,重新获取通道索引。通道号的依据 是设备的MAC地址唯一对应一个索引。 ## 注意事项 * 本代码未考虑安全场景,无鉴权,也无加密。无论是抓包还是发起访问都是毫无阻挡。若需要在公网使用,请自行设计安全机制。 * **src目录为服务端java源代码** 没有其他需要可以下载上面的发型版本,已包含64位jre17,也可以使用自定义jre17运行。 * 你可能需要加装天线,需要购买2.4G的天线,注意esp32cam上的天线接口附近的天线是否选择了ipex天线接口,否则需要动一下那个0欧电阻的方向,或者使用一坨锡代替也行。如果信号不好也可以靠近路由器试试。 * :file_folder: **simpleVideoRecorder目录为esp32cam(或合宙ESP32S3)的代码** 使用platformio基于ardunio框架开发。 1.使用platformio开发 修改simpleVideoRecorder 目录下的platformio.ini不同env的串口 切换开发板类型 修改以下内容切换开发板环境配置。来确定使用esp32cam配置或者使用合宙S3的配置。 ```ini [platformio] default_envs = esp32cam ;default_envs = heZhouS3 ``` 若使用命令则可以使用 -e 选项 后接具体env。 设置esp32 的CORE_DEBUG 日志级别,默认为info。 ```ini build_flags =XXX -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_INFO ;-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE ``` 需要根据实际需要修改分辨率。如果带宽不够。 如果图片较大,视频流畅度还行,但又水纹则是供电功率不足。 2.使用ardunio IDE开发 **重命名文件 ,新建项目** 为了保险起见,你可以把源码中`simpleVideoRecorder.cpp`重命名为`simpleVideoRecorder.ino` 文件夹名称则和ino文件保持一致,再用arduino ide打开。 **选择开发板** 选择开发板 为esp32cam,需要安装esp32环境 。 使用合宙S3时选择 `ESP32S3 Dev Module` ,一般默认就好,可以注意看psram需要设置为禁用。 若找不到ESP32S3相关开发板,则说明你的ide上的esp32相关环境未安装2.0以上的版本。添加(国内不建议使用以下json可以使用本人提供的json地址) ```tex https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json ``` 你的PC可能ping不通这个地址,仅仅因为DNS无法解析,可以使用一些公共DNS服务,如腾讯DNS 阿里DNS等等。 由于包很大也较多失败率也会很高。 **选择开发板引脚定义** 两个宏注释其中一个,二选一 ```cpp #define CAMERA_MODEL_AI_THINKER #define HE_ZHOU_S3 ``` **设置CORE DEBUG 级别** 在arduino ide的 工具 -> CORE DEBUG LEVEL 某些打印至少需要 info级别才能打印。 * 如果在局域网也可以使用PC作为服务端,查看充当服务端的PC的ip。 打开命令行,执行ipconfig。找到wifi所在网络的网卡ip. * 修改simpleVideoRecorder.cpp中的wifi的ssid和密码 * 可以使用linux的同学,自行根据实际组网查看和配置网络