Prechádzať zdrojové kódy

fix(panorama_camera): 优化RTSP视频流启动和缓冲设置

- 在启动RTSP视频流时设置环境变量以禁用多线程解码,增强线程安全
- 使用OpenCV CAP_FFMPEG后端并设置缓冲区大小为1,减少视频延迟
- 修改自动重连部分使用CAP_FFMPEG打开RTSP流,保持缓冲区设置一致
- 统一RTSP抓帧线程逻辑,避免多线程冲突引发崩溃
- 修复部分注释和异常捕获,提升代码健壮性
wenhongquan 4 dní pred
rodič
commit
581f85c213

BIN
dual_camera_system/__pycache__/panorama_camera.cpython-313.pyc


BIN
dual_camera_system/__pycache__/safety_coordinator.cpython-313.pyc


+ 11 - 2
dual_camera_system/panorama_camera.py

@@ -121,11 +121,20 @@ class PanoramaCamera:
             rtsp_url = self.config.get('rtsp_url') or f"rtsp://{self.config['username']}:{self.config['password']}@{self.config['ip']}:{self.config.get('rtsp_port', 554)}/h264/ch{self.config['channel']}/main/av_stream"
         
         try:
-            self.rtsp_cap = cv2.VideoCapture(rtsp_url)
+            # 使用 FFmpeg 单线程模式避免线程安全崩溃
+            # 设置环境变量禁用多线程解码
+            import os
+            os.environ['OPENCV_FFMPEG_CAPTURE_OPTIONS'] = 'threads;1'
+            
+            # 使用 CAP_FFMPEG 后端并设置单线程
+            self.rtsp_cap = cv2.VideoCapture(rtsp_url, cv2.CAP_FFMPEG)
             if not self.rtsp_cap.isOpened():
                 print(f"无法打开RTSP流: {rtsp_url}")
                 return False
             
+            # 设置缓冲区大小为1,减少延迟
+            self.rtsp_cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
+            
             self.running = True
             self.stream_thread = threading.Thread(target=self._rtsp_stream_worker, daemon=True)
             self.stream_thread.start()
@@ -174,7 +183,7 @@ class PanoramaCamera:
                     rtsp_url = self._build_rtsp_url()
                     try:
                         if self.rtsp_cap is None:
-                            self.rtsp_cap = cv2.VideoCapture(rtsp_url)
+                            self.rtsp_cap = cv2.VideoCapture(rtsp_url, cv2.CAP_FFMPEG)
                             self.rtsp_cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)  # 减少缓冲延迟
                         
                         if self.rtsp_cap.isOpened():

+ 5 - 1
dual_camera_system/safety_coordinator.py

@@ -492,7 +492,11 @@ class SimpleCamera:
     def connect(self) -> bool:
         """连接摄像头"""
         try:
-            self.cap = cv2.VideoCapture(self.source)
+            # 使用 FFmpeg 单线程模式避免线程安全崩溃
+            import os
+            os.environ['OPENCV_FFMPEG_CAPTURE_OPTIONS'] = 'threads;1'
+            self.cap = cv2.VideoCapture(self.source, cv2.CAP_FFMPEG)
+            self.cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
             self.connected = self.cap.isOpened()
             return self.connected
         except Exception as e: