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

如何在Python中使用OpenCV录制视频?现有代码仅支持HTML展示

如何基于现有OpenCV+Flask代码实现视频录制功能

1. 修正并扩展camera.py的录制逻辑

首先你代码里有个拼写错误:self.video.releast()应该改成self.video.release()。接下来添加录制相关的属性和方法,用cv2.VideoWriter处理视频写入:

import cv2
import datetime

class VideoCamera(object):
    def __init__(self):
        self.video = cv2.VideoCapture(1)
        # 录制状态标记
        self.is_recording = False
        self.video_writer = None

    def __del__(self):
        self.video.release()
        # 销毁时确保关闭视频写入器
        if self.video_writer is not None:
            self.video_writer.release()

    def get_frame(self):
        ret, frame = self.video.read()
        # 如果正在录制,把当前帧写入视频文件
        if self.is_recording and self.video_writer is not None:
            self.video_writer.write(frame)
        
        ret, jpeg = cv2.imencode('.jpg', frame)
        return jpeg.tobytes()

    def start_recording(self):
        if not self.is_recording:
            # 获取摄像头的宽高和帧率
            width = int(self.video.get(cv2.CAP_PROP_FRAME_WIDTH))
            height = int(self.video.get(cv2.CAP_PROP_FRAME_HEIGHT))
            fps = self.video.get(cv2.CAP_PROP_FPS) or 20.0  # 兼容部分设备无法获取帧率的情况
            
            # 生成带时间戳的文件名,避免重复
            timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
            output_filename = f"record_{timestamp}.avi"
            
            # 初始化VideoWriter,使用XVID编码
            fourcc = cv2.VideoWriter_fourcc(*'XVID')
            self.video_writer = cv2.VideoWriter(output_filename, fourcc, fps, (width, height))
            self.is_recording = True

    def stop_recording(self):
        if self.is_recording:
            self.is_recording = False
            if self.video_writer is not None:
                self.video_writer.release()
                self.video_writer = None

2. 扩展main.py的路由处理录制控制

添加两个POST接口处理开始/停止录制请求,同时复用全局摄像头实例避免重复创建:

from camera import VideoCamera
from flask import Flask, render_template, Response, request, jsonify

app = Flask(__name__)
# 全局摄像头实例
camera = VideoCamera()

@app.route("/Record", methods=['GET', 'POST'])
def Record():
    return render_template('record.html')

def gen(cam):
    while True:
        frame = cam.get_frame()
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame
               + b'\r\n\r\n')

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

# 开始录制接口
@app.route('/start_recording', methods=['POST'])
def start_recording():
    camera.start_recording()
    return jsonify({"status": "success", "message": "录制已开始"})

# 停止录制接口
@app.route('/stop_recording', methods=['POST'])
def stop_recording():
    camera.stop_recording()
    return jsonify({"status": "success", "message": "录制已停止"})

if __name__ == "__main__":
    app.run(debug=True)

3. 更新record.html添加录制控制按钮

在页面中添加控制按钮,用JavaScript发送AJAX请求控制录制并显示状态:

<body>
    <img id="bg" src="{{ url_for('video_feed') }}">
    <div style="margin-top: 10px;">
        <button id="startBtn" onclick="startRecording()">开始录制</button>
        <button id="stopBtn" onclick="stopRecording()" disabled>停止录制</button>
        <span id="status"></span>
    </div>

    <script>
        function startRecording() {
            fetch('/start_recording', { method: 'POST' })
                .then(response => response.json())
                .then(data => {
                    document.getElementById('status').textContent = data.message;
                    document.getElementById('startBtn').disabled = true;
                    document.getElementById('stopBtn').disabled = false;
                });
        }

        function stopRecording() {
            fetch('/stop_recording', { method: 'POST' })
                .then(response => response.json())
                .then(data => {
                    document.getElementById('status').textContent = data.message;
                    document.getElementById('startBtn').disabled = false;
                    document.getElementById('stopBtn').disabled = true;
                });
        }
    </script>
</body>

注意事项

  • 录制的视频文件会保存在Flask项目根目录下,文件名带时间戳避免重复
  • 确保环境已安装依赖:pip install opencv-python flask
  • 如果摄像头无法识别,尝试将cv2.VideoCapture(1)的设备索引改为0(不同设备索引可能不同)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:01:25