You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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")

关键修改说明

  1. 修复视频打开判断:调用video.isOpened()方法,并在打开失败时直接返回,避免后续无效操作。
  2. 调整帧处理顺序:只有读取到有效帧(isTrue为True)时,才执行绘制和写入操作,避免对None帧进行操作导致崩溃。
  3. 更换编码格式:使用mp4v编码,保证mp4容器的兼容性,确保写入的帧能被正常识别。

内容的提问来源于stack exchange,提问作者keibod nouripour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:00:52