一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何使用 OpenCV 在 Python 中录制视频

时间:2026-07-01 11:08:52 编辑:袖梨 来源:一聚教程网

本文详解如何基于 opencv 实现实时视频录制功能,包括初始化 videowriter、逐帧写入、资源释放等关键步骤,并适配 flask web 应用场景。

本文详解如何基于 opencv 实现实时视频录制功能,包括初始化 videowriter、逐帧写入、资源释放等关键步骤,并适配 flask web 应用场景。

在 Python 中使用 OpenCV 录制视频,核心在于结合 cv2.VideoCapture(捕获帧)与 cv2.VideoWriter(写入帧)协同工作。不同于仅显示视频流的场景,录制需持续接收每一帧并写入磁盘文件,最终生成标准视频格式(如 AVI、MP4)。以下为完整、可落地的实现方案。

✅ 正确初始化 VideoWriter

cv2.VideoWriter 需要四个关键参数:输出文件路径、编码器(FourCC)、帧率(FPS)和帧尺寸(宽×高)。注意:帧尺寸必须与实际采集帧一致,否则写入失败且无报错。常见编码器如下:

编码器 说明 兼容性
'XVID' 跨平台通用,生成 .avi 文件 ✅ Windows/Linux/macOS
'mp4v' MP4 容器推荐,生成 .mp4 文件 ✅(需 OpenCV ≥ 3.0,部分系统需 FFmpeg 支持)
'avc1' H.264 编码(需系统支持) ⚠️ 依赖底层编解码器

示例初始化(假设摄像头分辨率为 640×480):

self.fourcc = cv2.VideoWriter_fourcc(*'XVID')self.out = cv2.VideoWriter('output.avi', self.fourcc, 20.0, (640, 480))

? 提示:可通过 self.video.get(cv2.CAP_PROP_FRAME_WIDTH) 和 self.video.get(cv2.CAP_PROP_FRAME_HEIGHT) 动态获取实际分辨率,增强健壮性。

立即学习“Python免费学习笔记(深入)”;

✅ 修改 get_frame() 实现边预览边录制

每帧读取后,先写入视频文件,再编码为 JPEG 供 Web 流传输:

def get_frame(self):    ret, frame = self.video.read()    if ret:        # 确保尺寸匹配(关键!)        if frame.shape[1] != 640 or frame.shape[0] != 480:            frame = cv2.resize(frame, (640, 480))  # 统一分辨率        self.out.write(frame)  # 写入视频文件        ret, jpeg = cv2.imencode('.jpg', frame)        return jpeg.tobytes()    return None

✅ 安全释放资源(避免文件损坏)

务必在对象销毁时调用 release(),否则视频文件可能不完整或无法播放:

def __del__(self):    self.video.release()    self.out.release()  # 必须显式调用!

⚠️ 注意事项与最佳实践

  • 不要在多线程/多请求中复用同一 VideoWriter 实例:Flask 多 worker 场景下,应确保每个录制会话独占一个 VideoCamera 实例,或通过全局锁控制写入。
  • 文件命名需唯一:若多次访问 /Record,建议用时间戳动态生成文件名,例如:
    import datetimetimestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")self.out = cv2.VideoWriter(f'output_{timestamp}.avi', self.fourcc, 20.0, (640, 480))
  • MP4 支持问题:若使用 'mp4v' 却生成空文件,请确认 OpenCV 是否链接了 FFmpeg(运行 cv2.getBuildInformation() 查看 ffmpeg: YES);否则降级使用 'XVID' + .avi。
  • 性能考量:高分辨率(如 1080p)+ 高帧率(30 FPS)下,磁盘 I/O 可能成为瓶颈,建议在 SSD 环境运行或降低帧率/分辨率。

完成以上修改后,重启 Flask 应用,访问 /video_feed 即可实时预览并同步录制至本地 output.avi。录制结束后,该文件可直接用 VLC、PotPlayer 或系统默认播放器打开验证。

热门栏目