如何在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
相关产品推荐
相关产品推荐

