Python OpenCV录屏遇Fourcc编解码器错误,求解决方案
问题描述
运行录制摄像头的Python脚本时出现如下警告:
OpenCV: FFMPEG: tag 0x5634504d/'MP4V' is not supported with codec id 12 and format 'mp4 / MP4 (MPEG-4 Part 14)' OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'
同时录制出的MP4文件无法播放,原代码如下:
import cv2 cam = cv2.VideoCapture(0) width = int(cam.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cam.get(cv2.CAP_PROP_FRAME_HEIGHT)) fourcc = cv2.VideoWriter_fourcc(*"MP4V") writer = cv2.VideoWriter("captures/record.mp4", fourcc, 20, (width, height)) while True: is_camera_working, display = cam.read() cv2.imshow("Camera Data", display) if cv2.waitKey(25) & 0xFF == ord("q"): break cam.release() writer.release() cv2.destroyAllWindows
问题分析与解决方法
核心问题:未写入视频帧
你的代码仅初始化了VideoWriter,但循环中没有把读取到的帧写入文件,这是录制出空文件/无法播放的根本原因,和FFmpeg的警告无关。
解决步骤:
添加帧写入逻辑
在循环里调用writer.write(display),把每一帧写入视频文件,建议放在cv2.imshow之后、退出判断之前。处理FFmpeg警告(可选)
警告源于MP4容器对大写MP4V编码器标签兼容性差,换用以下任意方式即可解决:- 使用小写的
mp4v:fourcc = cv2.VideoWriter_fourcc(*"mp4v") - 使用兼容性更好的H.264编码器:
fourcc = cv2.VideoWriter_fourcc(*"avc1") - 让OpenCV自动选择合适编码器:将
fourcc参数设为-1,运行时会弹出选择框供你挑选兼容的编码器
- 使用小写的
完善代码健壮性
- 检查摄像头是否成功打开,避免后续报错
- 校验
cam.read()的返回值,防止读取空帧导致崩溃 - 修复
cv2.destroyAllWindows的语法错误,需要添加括号:cv2.destroyAllWindows()
修改后的完整代码
import cv2 # 初始化摄像头并检查是否成功打开 cam = cv2.VideoCapture(0) if not cam.isOpened(): print("无法打开摄像头") exit() width = int(cam.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cam.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 使用兼容的H.264编码器 fourcc = cv2.VideoWriter_fourcc(*"avc1") # 或者用自动选择:fourcc = -1 writer = cv2.VideoWriter("captures/record.mp4", fourcc, 20, (width, height)) while True: is_camera_working, display = cam.read() # 检查是否成功读取帧 if not is_camera_working: print("无法获取摄像头帧") break cv2.imshow("Camera Data", display) # 写入帧到视频文件 writer.write(display) if cv2.waitKey(25) & 0xFF == ord("q"): break # 释放资源 cam.release() writer.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者anbvy
相关产品推荐
相关产品推荐

