三台Logitech Brio相机OpenCV录制时单台FPS持续下降问题求助
问题描述
使用三台Logitech Brio相机,通过Python+OpenCV开启三个线程,每个线程独立创建VideoCapture和VideoWriter对象,从不同角度同时录制视频,所有相机均设置为60FPS。但录制完成后发现,两台相机帧率稳定,第三台帧率随时间逐渐下降,时间戳示例如下:
- camera1_frames_time: 00:16, 00:32, 00:48, 00:64
- camera2_frames_time: 00:16, 00:32, 00:48, 00:64
- camera3_frames_time: 00:16, 00:32, 00:50, 00:68
已完成的排查操作
已尝试以下所有手段,但问题未解决:
- 更换相机线缆
- 更换USB端口测试
- 购买新相机与原故障相机同测,帧率仍下降
- 仅保留故障相机和一台正常相机录制,故障相机帧率仍下降
- 单独录制故障相机,帧率依旧下降
- 更换全新相机,问题仍存在
- 使用OBS重置相机默认配置
运行环境
- 调试工具:带毫秒显示的运行时钟
- 脚本环境:Python 3、OpenCV 4.7.0.72、Ubuntu 20
核心代码
线程运行函数代码如下:
def run(self) -> None: """Thread runnable function.""" self.capture = cv2.VideoCapture(int(self.src_id)) self.capture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')) self.capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1080); self.capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 720); self.capture.set(cv2.CAP_PROP_FPS, 60) self.capture.set(cv2.CAP_PROP_BUFFERSIZE, 10) width = int(self.capture.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(self.capture.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = self.capture.get(cv2.CAP_PROP_FPS) file_name = f"recording-{self.src_id}.avi" out = cv2.VideoWriter( file_name, cv2.VideoWriter_fourcc("M", "J", "P", "G"), fps, (width, height) ) if self.capture.isOpened(): prev_frame_ts = 0 while not self.done: (self.status, self.frame) = self.capture.read() if self.status: out.write(self.frame) else: print("could not read frame, Return") break else: print("Failed to open camera. source id:" + str(self.src_id)) self.capture.release()
潜在原因分析
1. USB带宽分配瓶颈
Logitech Brio在1080p/60fps MJPG格式下,单台实际带宽需求约30-50MB/s,三台总带宽可能接近USB控制器极限。Ubuntu下部分USB端口共享同一控制器,若第三台相机所在控制器被其他设备占用带宽,会导致帧率随时间下降。可通过lsusb -t命令查看USB总线拓扑,确认三台相机的控制器分配情况。
2. 磁盘IO与缓冲区积压问题
虽然设置了CAP_PROP_BUFFERSIZE=10,但cv2.VideoCapture.read()是阻塞调用,当磁盘写入速度跟不上捕获速度时,缓冲区会溢出,导致后续帧读取延迟。第三台相机的线程可能因调度优先级低,或磁盘IO队列积压,出现帧写入滞后,进而打乱捕获节奏。可尝试将VideoWriter写入操作单独开线程,或更换SSD存储介质测试。
3. Linux内核UVC驱动兼容性
Ubuntu 20.04的内核版本可能对Logitech Brio的UVC驱动存在并发兼容性问题,多相机运行时,部分相机的帧率控制机制无法稳定维持60FPS。可通过dmesg命令查看是否有UVC相关错误日志(如uvcvideo: Failed to set UVC control value),或尝试升级内核版本。
4. Python线程调度不均衡
Python的GIL(全局解释器锁)会限制多线程的CPU执行效率,当某线程的IO操作(如磁盘写入)耗时增加时,可能抢占其他线程的CPU时间。第三台相机的线程若调度优先级较低,无法及时读取相机帧,会导致帧率下降。可尝试用多进程替代多线程,或给相机线程设置更高优先级。
5. USB端口供电不足
即使更换USB端口,部分前置端口或无外接电源的集线器供电能力有限,长时间运行后相机供电不稳定,会导致帧率下降。可尝试使用带外接电源的USB集线器,或将相机连接到主板后置USB端口测试。
内容的提问来源于stack exchange,提问作者Oded

