使用OpenCV-Python的VideoWriter输出视频时长为0的问题求助
解决OpenCV VideoWriter输出视频时长为0的问题
你遇到的问题是用OpenCV处理视频后,导出的视频时长为0,核心是代码里的几个细节错误导致帧没有正确写入:
错误点分析
- 视频打开状态判断错误:
video.isOpened ==False是访问属性而非调用方法,正确写法是video.isOpened()。如果视频未成功打开,后续操作都会失效。 - 帧处理顺序错误:在调用
cv.rectangle绘制图形前,没有先判断isTrue是否为True。当视频读取到末尾时,frame会是None,此时执行绘制操作会抛出异常,导致程序提前终止,VideoWriter来不及写入有效帧。 - 编码格式兼容性问题:用
vp09编码写入mp4容器,部分环境下可能不兼容,导致输出文件无法正常识别帧数据。
修正后的代码
import cv2 as cv def Mask_info(path): """This function will mask the information part of the video""" video = cv.VideoCapture(path) # 先判断视频是否成功打开 if not video.isOpened(): print("Error while reading the file.") return # 打开失败直接退出函数 framenum = video.get(cv.CAP_PROP_FRAME_COUNT) fps = video.get(cv.CAP_PROP_FPS) # 改用mp4兼容的编码格式 fourcc = cv.VideoWriter_fourcc(*"mp4v") width = int(video.get(cv.CAP_PROP_FRAME_WIDTH)) height = int(video.get(cv.CAP_PROP_FRAME_HEIGHT)) size = (width, height) result = cv.VideoWriter("masked_video.mp4", fourcc, fps, size) while True: isTrue, frame = video.read() # 先判断是否读取到有效帧,再进行绘制和写入 if isTrue: cv.rectangle(frame,(65,0),(255,10),(0,0,0),-1) cv.rectangle(frame,(394,0),(571,10),(0,0,0),-1) result.write(frame) cv.imshow("Masked Video", frame) if cv.waitKey(1) & 0xFF == ord("d"): break else: break video.release() result.release() cv.destroyAllWindows() Mask_info("samplesound.webm")
关键修改说明
- 修复视频打开判断:调用
video.isOpened()方法,并在打开失败时直接返回,避免后续无效操作。 - 调整帧处理顺序:只有读取到有效帧(
isTrue为True)时,才执行绘制和写入操作,避免对None帧进行操作导致崩溃。 - 更换编码格式:使用
mp4v编码,保证mp4容器的兼容性,确保写入的帧能被正常识别。
内容的提问来源于stack exchange,提问作者keibod nouripour
相关产品推荐
相关产品推荐

