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

Flask结合OpenCV的摄像头推流不支持多设备同时访问该如何解决?

问题原因

V4L2协议挂载的摄像头是系统独占资源,你原有代码的逻辑是每次有新客户端请求/video_feed接口时,都会在gen_frames函数内尝试新建VideoCapture实例占用摄像头,第二个请求发起时摄像头已经被第一个请求占用,因此抛出无法打开设备的报错。

线程方案完全可以解决该问题,优化核心逻辑是全局仅初始化一次摄像头,用独立线程统一捕获帧,所有客户端请求都从公共缓存取帧推送,避免重复抢占设备。


修改后可运行代码

from flask import Flask, render_template, Response
import cv2
import threading

app = Flask(__name__)

# 全局变量:最新帧缓存、读写锁、摄像头实例
latest_frame = None
frame_lock = threading.Lock()
camera = cv2.VideoCapture(-1, cv2.CAP_V4L2)

def capture_frames():
    """后台常驻线程,单独负责持续读取摄像头帧"""
    global latest_frame
    while True:
        success, frame = camera.read()
        if not success:
            break
        # 加锁更新全局帧缓存,避免读写冲突
        with frame_lock:
            latest_frame = frame.copy()

# 启动帧捕获后台线程,设为守护线程跟随主进程退出
capture_thread = threading.Thread(target=capture_frames, daemon=True)
capture_thread.start()

def gen_frames():
    """客户端推流逻辑,不再单独操作摄像头,直接从全局缓存取帧"""
    while True:
        # 加锁读取最新帧
        with frame_lock:
            if latest_frame is None:
                continue
            frame = latest_frame.copy()
        # 编码为jpg格式推流
        ret, buffer = cv2.imencode('.jpg', frame)
        frame_bytes = buffer.tobytes()
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame_bytes + b'\r\n')

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/video_feed')
def video_feed():
    return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == "__main__":
    # debug模式下必须关闭自动重载,否则会启动两个进程重复初始化摄像头
    app.run(host= '0.0.0.0', port=3884, debug=True, use_reloader=False)

注意事项

  • 如果需要支持10个以上客户端同时访问,可以把帧编码逻辑也移到后台捕获线程中完成,减少每个请求的重复计算开销
  • 可以在摄像头初始化后通过camera.set(cv2.CAP_PROP_FRAME_WIDTH, 640)、camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)、camera.set(cv2.CAP_PROP_FPS, 15)调整分辨率和帧率,避免高负载下卡顿
  • 生产环境部署时关闭debug模式即可,不需要保留use_reloader=False参数

内容的提问来源于stack exchange,提问作者CY83

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:15:04