当前位置: 首页 > article >正文

别再为视频格式发愁了!Python OpenCV cv2.VideoWriter() 保姆级教程,从摄像头录制到文件保存一次搞定

Python OpenCV视频保存终极指南从摄像头录制到文件输出的完整解决方案每次用OpenCV保存视频时是不是总遇到各种莫名其妙的错误视频打不开、编码器不支持、分辨率对不上...这些问题困扰过几乎所有刚开始接触计算机视觉的开发者。今天我们就来彻底解决这些痛点让你一次性掌握cv2.VideoWriter()的所有实战技巧。1. 视频保存基础理解核心参数在开始写代码之前我们需要先搞清楚几个关键概念。cv2.VideoWriter()就像是一个视频录制工厂而它的参数就是控制这个工厂如何运作的指令。1.1 FourCC编码器视频的语言FourCCFour Character Code是视频编码器的唯一标识符它决定了视频将以什么格式被保存。不同的操作系统对编码器的支持程度不同这是导致很多兼容性问题的根源。常见FourCC编码器对比编码器文件格式Windows支持macOS支持Linux支持适用场景XVIDAVI优秀需插件良好通用场景MJPGAVI优秀中等良好高画质mp4vMP4需解码器优秀良好跨平台avc1MP4中等优秀优秀iOS兼容# 获取系统支持的FourCC编码器列表Windows特有 def get_available_fourcc(): import subprocess result subprocess.run([ffmpeg, -codecs], capture_outputTrue, textTrue) return [line.split()[1] for line in result.stdout.split(\n) if D.V in line]提示在不确定系统支持哪些编码器时可以先尝试MJPG它在大多数平台上都有较好的兼容性。1.2 分辨率与帧率视频的尺寸和速度分辨率(frameSize)和帧率(fps)必须与视频源保持一致否则会导致保存失败或视频异常。一个常见的错误是从摄像头读取640x480的视频却尝试保存为1920x1080。import cv2 cap cv2.VideoCapture(0) # 获取摄像头的实际分辨率 width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps cap.get(cv2.CAP_PROP_FPS) # 可能返回0需要手动设置 print(f摄像头分辨率: {width}x{height}, 帧率: {fps})2. 实战从摄像头录制视频现在我们来构建一个完整的摄像头录制程序包含错误处理和用户友好的交互。2.1 基础录制程序import cv2 import sys def record_from_camera(output_fileoutput.avi, fourccMJPG, fps30): cap cv2.VideoCapture(0) if not cap.isOpened(): print(无法打开摄像头) return False # 获取摄像头实际参数 width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 创建VideoWriter fourcc cv2.VideoWriter_fourcc(*fourcc) out cv2.VideoWriter(output_file, fourcc, fps, (width, height)) print(录制中... 按Q键停止) while True: ret, frame cap.read() if not ret: print(无法获取帧可能摄像头已断开) break out.write(frame) cv2.imshow(录制预览, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() out.release() cv2.destroyAllWindows() return True if __name__ __main__: # 示例录制MP4格式视频 record_from_camera(output_fileoutput.mp4, fourccmp4v)2.2 高级功能扩展实际项目中我们往往需要更多控制功能。下面是一个增强版录制程序class VideoRecorder: def __init__(self, source0, outputoutput.avi, fourccMJPG, fps30): self.cap cv2.VideoCapture(source) if not self.cap.isOpened(): raise IOError(无法打开视频源) self.width int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)) self.height int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) self.fps fps if fps 0 else 30 self.fourcc cv2.VideoWriter_fourcc(*fourcc) self.writer cv2.VideoWriter(output, self.fourcc, self.fps, (self.width, self.height)) self.is_recording False self.frame_count 0 def start(self): self.is_recording True print(开始录制...) def stop(self): self.is_recording False self.cap.release() self.writer.release() print(f录制结束共保存{self.frame_count}帧) def process_frame(self, frame): # 这里可以添加各种帧处理逻辑 return frame def run(self): self.start() try: while self.is_recording: ret, frame self.cap.read() if not ret: break processed_frame self.process_frame(frame) self.writer.write(processed_frame) self.frame_count 1 cv2.imshow(录制中, processed_frame) if cv2.waitKey(1) 0xFF ord(q): break finally: self.stop() cv2.destroyAllWindows() # 使用示例 recorder VideoRecorder(outputenhanced.mp4, fourccmp4v) recorder.run()3. 常见问题与解决方案3.1 无法打开视频文件错误这个问题通常由以下原因导致路径包含中文或特殊字符没有写入权限文件扩展名与编码器不匹配解决方案import os def safe_video_writer(output_path, fourcc, fps, frame_size): # 确保目录存在 os.makedirs(os.path.dirname(output_path) or ., exist_okTrue) # 验证扩展名 ext os.path.splitext(output_path)[1].lower() if ext .avi and mp4v in fourcc.lower(): print(警告: AVI文件通常不使用mp4v编码器) return cv2.VideoWriter(output_path, fourcc, fps, frame_size)3.2 视频播放卡顿或不同步这种问题通常源于帧率设置不正确写入速度跟不上采集速度系统资源不足优化建议使用更高效的编码器如MJPG降低分辨率使用多线程分离采集和写入过程from threading import Thread import queue class AsyncVideoWriter: def __init__(self, output, fourcc, fps, frame_size, max_queue_size30): self.writer cv2.VideoWriter(output, fourcc, fps, frame_size) self.frame_queue queue.Queue(maxsizemax_queue_size) self.running False def start(self): self.running True Thread(targetself._write_loop, daemonTrue).start() def _write_loop(self): while self.running or not self.frame_queue.empty(): try: frame self.frame_queue.get(timeout1) self.writer.write(frame) except queue.Empty: continue def add_frame(self, frame): self.frame_queue.put(frame) def stop(self): self.running False self.writer.release()4. 高级技巧与性能优化4.1 多视频源录制有时我们需要同时录制多个摄像头或视频源def multi_camera_record(sources, outputs, fourccs, fps_list): caps [cv2.VideoCapture(src) for src in sources] writers [ cv2.VideoWriter(out, cv2.VideoWriter_fourcc(*codec), fps, (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))) for cap, out, codec, fps in zip(caps, outputs, fourccs, fps_list) ] try: while True: frames [] for cap in caps: ret, frame cap.read() if not ret: raise IOError(摄像头断开连接) frames.append(frame) for writer, frame in zip(writers, frames): writer.write(frame) # 显示预览可选 combined cv2.hconcat(frames) cv2.imshow(多摄像头录制, combined) if cv2.waitKey(1) 0xFF ord(q): break finally: for cap in caps: cap.release() for writer in writers: writer.release() cv2.destroyAllWindows()4.2 视频质量与压缩平衡不同的应用场景需要不同的视频质量设置。以下是一些经验值应用场景推荐编码器推荐分辨率帧率备注监控视频MJPG720p15平衡画质和存储视频会议mp4v1080p30需要清晰度动作分析XVID480p60高帧率优先延时摄影avc14K5高分辨率优先def optimize_settings(use_case): profiles { surveillance: (MJPG, (1280, 720), 15), conference: (mp4v, (1920, 1080), 30), sports: (XVID, (640, 480), 60), timelapse: (avc1, (3840, 2160), 5) } return profiles.get(use_case, (MJPG, (640, 480), 30))4.3 硬件加速编码对于高性能应用可以使用硬件加速编码def get_hardware_accel_writer(output, fps, frame_size): # 尝试各种硬件加速后端 backends [ (h264_nvenc, avc1), # NVIDIA GPU (h264_videotoolbox, avc1), # macOS (h264_amf, avc1), # AMD GPU (libx264, avc1) # CPU软编码 ] for codec, fourcc in backends: try: writer cv2.VideoWriter(output, cv2.VideoWriter_fourcc(*fourcc), fps, frame_size) if writer.isOpened(): print(f使用硬件加速: {codec}) return writer except: continue print(未找到硬件加速使用默认编码器) return cv2.VideoWriter(output, cv2.VideoWriter_fourcc(*mp4v), fps, frame_size)在实际项目中使用这些技巧时记得根据具体硬件和环境进行调整。不同显卡和操作系统对硬件加速的支持程度差异很大需要充分测试。

相关文章:

别再为视频格式发愁了!Python OpenCV cv2.VideoWriter() 保姆级教程,从摄像头录制到文件保存一次搞定

Python OpenCV视频保存终极指南:从摄像头录制到文件输出的完整解决方案 每次用OpenCV保存视频时,是不是总遇到各种莫名其妙的错误?视频打不开、编码器不支持、分辨率对不上...这些问题困扰过几乎所有刚开始接触计算机视觉的开发者。今天我们就…...

ROS Kinetic/Melodic用户看过来:用Conda虚拟环境完美兼容Python2.7的ROS包和Python3的AI工具

ROS与Python3协同开发:用Conda虚拟环境构建高效混合工作流 当机器人操作系统(ROS)遇上现代AI工具链,版本冲突就成了开发者最头疼的问题。上周我调试一个需要同时调用ROS导航包和PyTorch模型的机器人项目时,系统崩溃了三次——直到在Conda中构…...

FreeRTOS二值信号量实战:如何用STM32串口中断实现任务同步(附完整代码)

FreeRTOS二值信号量在STM32串口通信中的实战应用 1. 嵌入式系统中的任务同步挑战 在嵌入式实时操作系统中,任务间的有效通信和同步是系统设计的关键。想象一个典型的工业控制场景:传感器数据通过串口源源不断地传入,主控芯片需要实时处理这些…...

深入探索AMD Ryzen处理器:SMUDebugTool架构解析与实战应用

深入探索AMD Ryzen处理器:SMUDebugTool架构解析与实战应用 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:…...

避坑指南:华为设备GRE over IPSec配置中,ACL规则写错导致隧道不通的排查全过程

华为设备GRE over IPSec配置实战:ACL规则配置错误导致隧道不通的深度排查指南 当你第一次配置GRE over IPSec隧道时,最令人沮丧的莫过于所有配置看起来都正确,但隧道就是无法建立。上周我就遇到了这样一个案例——一位工程师在配置华为AR2220…...

LayerDivider:3分钟将单张插画转换为分层PSD的智能解决方案

LayerDivider:3分钟将单张插画转换为分层PSD的智能解决方案 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾花费数小时手动分离插画图…...

猫抓插件终极指南:三步轻松下载网页所有视频音频资源

猫抓插件终极指南:三步轻松下载网页所有视频音频资源 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓插件是一款功能强大的浏览器资…...

如何构建终极家庭游戏串流服务器:Sunshine完整指南

如何构建终极家庭游戏串流服务器:Sunshine完整指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款强大的自托管游戏串流服务器,专为Moonlig…...

STM32F407与K210(K230)串口通信实战:如何设计一个可靠的命令-响应协议?

STM32F407与K210(K230)串口通信实战:工业级命令-响应协议设计指南 在智能硬件开发中,串口通信就像设备间的"普通话"——简单直接,但要让两个不同架构的芯片(如STM32F407和K210)实现可…...

Balena Etcher:革命性镜像烧录工具的一站式解决方案

Balena Etcher:革命性镜像烧录工具的一站式解决方案 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher 你是否曾经因为一个简单的系统镜像烧录任务而陷入…...

从零构建中文NL2SQL数据集:基于GRPO强化学习微调Qwen3-8B,解锁300行复杂SQL生成

1. 中文NL2SQL数据集构建方法论 要让AI模型真正理解中文自然语言并生成准确的SQL查询,数据集的构建是基础中的基础。我花了三个月时间专门研究如何构建高质量的中文NL2SQL数据集,最终总结出一套可复用的方法论。 数据来源的选择直接影响数据集质量。我建…...

保姆级教程:手把手教你为小智AI Pro更换专属唤醒词和背景图(ESP32-S3实战)

保姆级教程:手把手教你为小智AI Pro更换专属唤醒词和背景图(ESP32-S3实战) 刚拿到小智AI Pro开发板时,最让人兴奋的莫过于能打造属于自己的智能语音助手。想象一下,当你说出"嘿,贾维斯"就能唤醒…...

智慧城市井盖智能巡检 智能城市道路巡检系统 井盖缺陷异常等识别 井盖缺失破损识别数据集 改进的yolo算法数据集第10311期

井盖数据集数据集核心信息表信息类别详情类别共 5 类,分别为破损(broke)、圆圈(circle)、好的(good)、丢失(lose)、未覆盖的(uncovered)数量包含 …...

智慧车辆内饰识别数据集 汽车内饰实例分割数据集 汽车仪表盘 方向盘 挡杆 座椅图像分割数据集 unet yolo格式数据集

汽车内饰实例分割数据集核心信息简介 类别Tags 标签 Instance Segmentation 实例分割 Classes (23) 类别(23) AC Climate Control Block 空调气候控制模块 Armrests 扶手 Bluetooth 蓝牙 Center Console 中央控制台 Cruise Control 定速巡航 Driver Dash…...

从硬件到Java:揭秘volatile如何守护线程安全的三大支柱

1. 从晶体管到Java线程:为什么需要volatile? 记得我第一次在多线程环境下调试程序时,遇到过这样一个诡异现象:某个状态变量明明已经被修改,但其他线程却始终读取到旧值。当时我的反应和大多数新手一样——反复检查赋值…...

告别裸机联网:在STM32F407上基于FreeRTOS和LwIP实现多任务TCP通信(CubeMX配置详解)

从裸机到RTOS:STM32F407网络通信实战指南 在嵌入式开发领域,从裸机编程转向RTOS系统是一个关键的进阶步骤。对于需要同时处理传感器数据采集和网络通信的智能设备项目,裸机轮询架构很快就会遇到性能瓶颈和代码复杂度问题。本文将带你深入探索…...

[具身智能-378]:Sim2Real 详解(Simulation-to-Reality)

📘 Sim2Real 详解(Simulation-to-Reality)Sim2Real 是机器人学、自动驾驶、具身智能与计算机视觉中的核心范式,指在仿真环境中训练 AI 模型/控制策略/感知系统,并安全、高效地迁移到物理真实世界的技术体系。下面从原理…...

盘点四个与Three.js协同的Web3D动画库:选型指南与实战解析

1. 为什么需要动画库配合Three.js? 很多刚接触Web3D开发的程序员都会有这样的疑问:Three.js本身不是已经提供了动画系统吗?为什么还要引入额外的动画库?这个问题我刚开始做3D项目时也纠结过,后来踩过几次坑才明白其中的…...

2026年环境科学论文降AI工具推荐:环境数据和生态分析部分如何降

2026年环境科学论文降AI工具推荐:环境数据和生态分析部分如何降 试过五款工具之后,现在固定用嘎嘎降AI(www.aigcleaner.com)。 价格4.8元一篇,实测知网从61%降到5.3%。环境科学论文降AI选工具不用纠结太久&#xff0…...

Phi-3 Mini部署教程:使用vLLM优化Phi-3 Forest Lab吞吐量与并发能力

Phi-3 Mini部署教程:使用vLLM优化Phi-3 Forest Lab吞吐量与并发能力 1. 项目介绍 Phi-3 Forest Lab是一个基于微软Phi-3 Mini 128K Instruct模型构建的轻量级AI对话终端。这个项目将前沿的大模型技术与自然美学设计相结合,为用户提供一个高效且富有美感…...

VoIP移动设备功耗优化与ARM架构实践

1. VoIP技术在手设备中的核心挑战VoIP技术从诞生之初就展现出革命性的潜力,但在移动设备上的实际应用却长期受限于功耗与成本两大瓶颈。作为在通信行业深耕十余年的工程师,我见证了VoIP从PC软电话到移动终端的完整演进历程。当前主流智能手机的VoWiFi通话…...

LM386功放电路在STM32收音机项目中的实战应用与噪音消除技巧

LM386功放电路在STM32收音机项目中的实战优化与噪音治理 当你在深夜调试收音机项目时,那种细微却顽固的"嘶嘶"声是否让你抓狂?作为硬件开发者,我们都经历过这种折磨——明明电路设计符合教科书规范,焊接检查无误&#x…...

从光模块到按键:拆解一个经典芯片SN75451B,看施密特触发器如何‘兼职’电平转换与驱动

施密特触发器的工业级应用:从信号整形到智能驱动的实战解析 在嘈杂的工业环境中,信号完整性往往成为硬件工程师最头疼的问题之一。想象一下,当你的光传感器接收到的信号被电磁干扰扭曲得面目全非,或者微控制器输出的3.3V逻辑需要驱…...

uniapp主题切换功能的第三种实现方式(scss变量+动态class绑定)

1. 为什么需要第三种主题切换方案 在uniapp开发中,主题切换功能一直是刚需。前两种方案(scss变量vuex和scss变量require)我都深度使用过,但实际项目中总会遇到些头疼的问题。先说vuex方案,最大的痛点就是每次新增主题色…...

【企业级生成式AI配置中枢白皮书】:基于127个生产环境故障反推的7层安全隔离设计模型

第一章:生成式AI应用配置中心的设计目标与演进路径 2026奇点智能技术大会(https://ml-summit.org) 生成式AI应用配置中心并非传统配置管理系统的简单延伸,而是面向大模型推理服务、多模态编排、提示工程治理与实时策略调控的新型基础设施。其核心使命是…...

从面试官视角看:2026年,什么样的前端项目经历能让你脱颖而出?

2026年前端面试突围指南:如何用项目经验打造技术叙事力 1. 从执行者到思考者:项目复盘的价值重构 在2026年的前端技术面试中,面试官最反感的莫过于候选人机械罗列技术栈而缺乏深度思考。我曾作为面试官遇到过一位候选人,当被问及&…...

AI社交助手已进入实战阶段:2026奇点大会公布的3项核心API接口及接入避坑指南

第一章:AI社交助手已进入实战阶段:2026奇点大会公布的3项核心API接口及接入避坑指南 2026奇点智能技术大会(https://ml-summit.org) 2026奇点大会正式宣告AI社交助手脱离概念验证阶段,进入企业级生产部署周期。大会首次开放三项经亿级用户会…...

VxWorks RTOS:嵌入式实时操作系统的核心技术与应用

1. VxWorks RTOS:嵌入式系统的安全与性能革新在火星探测器着陆的最后一秒,当降落伞必须在精确的15毫秒内展开时;当医疗呼吸机需要以微秒级精度调节气流时;当自动驾驶汽车必须同时处理12个摄像头数据并做出避障决策时——这些场景背…...

终极指南:10分钟掌握FModel虚幻引擎资源浏览器

终极指南:10分钟掌握FModel虚幻引擎资源浏览器 【免费下载链接】FModel Unreal Engine Archives Explorer 项目地址: https://gitcode.com/gh_mirrors/fm/FModel FModel是一款专为虚幻引擎游戏设计的资源浏览器工具,能够让你轻松查看、预览和导出…...

从原理到实战:ChameleonUltra开源RFID工具的全栈解析

1. ChameleonUltra是什么?能做什么? 第一次听说ChameleonUltra这个开源项目时,我脑海中浮现的是一只真正的变色龙——它能根据环境改变颜色,完美融入周围。这个比喻意外地贴切,因为ChameleonUltra确实是一款能"变…...