程序代码篇---Python处理ESP32-S3-cam视频流
文章目录
- 前言
- 一、基本获取、显示代码
- 1.代码说明
- 1.1功能概述
- 1.2关键部分
- 1.3注意要点
- 二、优化显示代码
- 1.优化说明
- 1.1多线程处理
- 1.2帧处理优化
- 1.3错误处理增强
- 1.4显示性能优化
- 2.额外优化建议
- 2.1调整 ESP32 - S3 - cam 设置
- 2.2网络优化
- 2.3硬件加速
- 2.4进一步代码优化
前言
使用 Python 获取 ESP32 - S2 - cam 生成在 http 网址上的视频流并显示的解决方案以及提升 ESP32 - S2 - cam 视频流显示性能的方法。
一、基本获取、显示代码
import cv2def display_esp32_cam_stream(url):# 创建VideoCapture对象cap = cv2.VideoCapture(url)# 检查摄像头是否成功打开if not cap.isOpened():print("无法连接到ESP32 - S2 - cam视频流")returnprint("成功连接到视频流,按 'q' 键退出")while True:# 读取视频帧ret, frame = cap.read()# 检查是否成功读取帧if not ret:print("无法获取帧,退出")break# 显示帧cv2.imshow('ESP32 - S2 - cam视频流', frame)# 按 'q' 键退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源cap.release()cv2.destroyAllWindows()if __name__ == "__main__":# 请替换为你的ESP32 - S2 - cam的视频流URLesp32_cam_url = "http://your_esp32_cam_ip_address:81/stream"display_esp32_cam_stream(esp32_cam_url)
1.代码说明
1.1功能概述
功能概述:此脚本借助 OpenCV 库来获取并显示 ESP32 - S2 - cam 的视频流。
1.2关键部分
要使用该脚本,需先安装 OpenCV 库,可通过命令
pip install opencv - python
进行安装。
你需要把代码中的http://your_esp32_cam_ip_address:81/stream替换成你 ESP32 - S2 - cam 实际的视频流 URL。
当脚本运行后,会弹出一个窗口显示视频流,按下键盘上的q键就能退出显示。
1.3注意要点
- 要保证 ESP32 - S2 - cam 正常运行,并且网络连接稳定。
- 要确认 ESP32 - S2 - cam 的 IP 地址以及视频流端口号(通常是 81)。
- 若视频流无法正常显示,你可以尝试检查 ESP32 - S2 - cam 的配置或者网络连接情况。
二、优化显示代码
import cv2
import threading
from collections import dequeclass VideoStream:def __init__(self, url):self.url = urlself.cap = cv2.VideoCapture(url)self.stopped = Falseself.frames = deque(maxlen=1)self.thread = threading.Thread(target=self.update, args=())self.thread.daemon = Truedef start(self):self.thread.start()return selfdef update(self):while not self.stopped:if not self.cap.isOpened():print("重新连接到视频流...")self.cap = cv2.VideoCapture(self.url)continueret, frame = self.cap.read()if ret:# 调整帧大小以提高性能frame = cv2.resize(frame, (640, 480))self.frames.append(frame)def read(self):return self.frames[-1] if self.frames else Nonedef stop(self):self.stopped = Trueself.thread.join()self.cap.release()def display_esp32_cam_stream(url):# 创建视频流对象vs = VideoStream(url).start()# 检查摄像头是否成功打开if not vs.cap.isOpened():print("无法连接到ESP32 - S2 - cam视频流")vs.stop()returnprint("成功连接到视频流,按 'q' 键退出")# 设置窗口属性cv2.namedWindow('ESP32 - S2 - cam视频流', cv2.WINDOW_NORMAL)cv2.resizeWindow('ESP32 - S2 - cam视频流', 640, 480)while True:# 从队列中获取最新帧frame = vs.read()if frame is not None:# 显示帧cv2.imshow('ESP32 - S2 - cam视频流', frame)# 按 'q' 键退出循环,增加响应速度key = cv2.waitKey(1)if key == ord('q'):break# 释放资源vs.stop()cv2.destroyAllWindows()if __name__ == "__main__":# 请替换为你的ESP32 - S2 - cam的视频流URLesp32_cam_url = "http://your_esp32_cam_ip_address:81/stream"display_esp32_cam_stream(esp32_cam_url)
1.优化说明
1.1多线程处理
采用专门的线程来读取视频帧,防止 I/O 操作阻塞主线程。
运用双端队列(deque)缓存最新的一帧,保证显示的是实时画面。
1.2帧处理优化
自动调整帧大小为 640×480,减轻 CPU 的处理负担。
只保留最新的一帧,避免队列中积压过多帧而导致延迟。
1.3错误处理增强
增添了自动重连机制,当视频流中断时能够尝试重新连接。
优化了资源释放流程,防止出现内存泄漏的情况。
1.4显示性能优化
预先设置窗口大小,减少动态调整带来的开销。
优化了按键响应逻辑,提升用户体验。
2.额外优化建议
2.1调整 ESP32 - S3 - cam 设置
把分辨率调低(如 320×240),可以降低带宽的需求。
**降低帧率(如 10fps),**能减少数据传输量。
2.2网络优化
让 ESP32 和接收设备处于同一个局域网内,减少网络延迟。
优先使用有线网络连接 ESP32,保证网络连接稳定。
2.3硬件加速
要是处理能力不足,可以考虑使用硬件解码(例如 OpenCV 的 GPU 加速)。
2.4进一步代码优化
可以添加丢帧逻辑,在网络状况不佳时保证视频的流畅性。
实现动态帧率调整,根据网络状况自动优化性能。