如何解决OpenCV保存MJPG格式视频的编码错误与GStreamer警告?
解决OpenCV保存MJPG的编码错误与GStreamer警告
一、编码错误(FFMPEG tag不支持)的解决方法
这个错误核心是文件扩展名与编码容器不匹配,再加上参数小问题导致的:
- 修改文件扩展名:把
output.mjpeg改成output.avi,AVI容器对MJPEG编码的兼容性更好,FFMPEG能正确识别对应编码格式。 - 修正帧率参数的冗余括号:原代码里
(frame_per_sec)多了一层括号,直接写frame_per_sec即可。 - 保留MJPG的FourCC编码:不用修改大小写,
cv2.VideoWriter_fourcc('M','J','P','G')本身是正确的编码标识。
二、GStreamer警告的解决方法
警告是因为默认使用GStreamer后端读取摄像头,而你的设备不支持查询视频位置,指定对应系统的摄像头后端就能消除警告:
- Linux系统:用V4L2后端,初始化摄像头时写成
cap = cv2.VideoCapture(0, cv2.CAP_V4L2) - Windows系统:用DSHOW后端,写成
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) - macOS系统:用AVFoundation后端,写成
cap = cv2.VideoCapture(0, cv2.CAP_AVFOUNDATION)
修改后的完整代码
import cv2 import numpy as np # 根据你的操作系统选择对应的后端 cap = cv2.VideoCapture(0, cv2.CAP_V4L2) # Linux用该行;Windows替换为cv2.CAP_DSHOW;macOS替换为cv2.CAP_AVFOUNDATION if cap.isOpened() == False: print("Unable to read camera feed") exit() # 打不开摄像头直接退出,避免后续报错 frame_width = int(cap.get(3)) frame_height = int(cap.get(4)) frame_per_sec = 10 # 直接写数值,无需int('10'),更简洁 # 更换为avi扩展名,修正参数格式 out = cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc('M','J','P','G'), frame_per_sec, (frame_width, frame_height)) while True: ret, frame = cap.read() if ret == True: out.write(frame) cv2.imshow('frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break else: break cap.release() out.release() cv2.destroyAllWindows()
额外说明
如果坚持要保存成.mjpeg扩展名,可以尝试把FourCC改成cv2.VideoWriter_fourcc('J','P','E','G'),同时确保本地FFMPEG支持该容器的编码逻辑。
内容的提问来源于stack exchange,提问作者portsample
相关产品推荐
相关产品推荐

