使用OpenCV VideoWriter创建的视频无法播放,求助排查
问题:生成的视频无法播放
- Firefox浏览器提示“找不到具有支持格式和MIME类型的视频。”
- VLC播放器提示“无法找到任何/moov/trak”“未找到流”
原因分析
核心问题是**VideoWriter的frame_size参数顺序错误**:
OpenCV的VideoWriter要求frame_size传入(宽度, 高度),但你通过cam.read()[1].shape[:2]获取的是(高度, 宽度)(OpenCV读取的图像shape格式为(height, width, channels))。参数顺序颠倒会破坏视频文件的结构,导致播放器无法识别有效流信息。
此外,原代码未检查摄像头初始化和帧读取是否成功,若摄像头无法正常工作,会写入无效数据进一步损坏文件。
修正后的代码
import cv2 FPS = 30 KEY_ESC = 27 OUTPUT_FILE = "vid.mp4" cam = cv2.VideoCapture(0) # 校验摄像头是否成功打开 if not cam.isOpened(): print("无法打开摄像头") exit() # 读取初始帧并验证 success, image = cam.read() if not success: print("无法读取摄像头画面") cam.release() exit() codec = cv2.VideoWriter.fourcc(*"mp4v") # 修正尺寸顺序:(宽度, 高度) frame_size = (image.shape[1], image.shape[0]) video_writer = cv2.VideoWriter(OUTPUT_FILE, codec, FPS, frame_size) # 录制直到按下ESC退出 while True: success, image = cam.read() if not success: print("读取画面失败,停止录制") break cv2.imshow("window", image) video_writer.write(image) if cv2.waitKey(5) == KEY_ESC: break # 释放所有资源 cam.release() video_writer.release() cv2.destroyAllWindows()
关键修改点
- 调整
frame_size的参数顺序,从(height, width)改为(width, height) - 添加摄像头初始化和帧读取的错误检查,避免无效数据写入
- 增加
cv2.destroyAllWindows(),确保录制结束后关闭显示窗口
内容的提问来源于stack exchange,提问作者mcp
相关产品推荐
相关产品推荐

