You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

三台Logitech Brio相机OpenCV录制时单台FPS持续下降问题求助

三台Logitech Brio相机录制时单台帧率持续下降的问题排查与潜在原因分析

问题描述

使用三台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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:52:30