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

使用OpenCV(cv2)实现视频结束后切换播放另一视频遇报错求助

OpenCV播放完第一个视频自动切换第二个视频报错的解决方法

问题描述

尝试实现第一个视频播放结束后自动切换到第二个视频,预期正常播放第二个视频,但实际窗口直接关闭,命令行报错:

cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:967: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

使用的代码如下:

import numpy as np
import cv2 as cv
cap = cv.VideoCapture('video.mp4')
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        cap = cv.VideoCapture('video2.mp4')
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
cap.release()
cv.destroyAllWindows()

错误原因

  1. 当第一个视频读取到末尾时,ret变为False,此时frame是无效的空帧,但代码紧接着执行cv.imshow('frame', frame),空帧不满足imshow的尺寸要求,直接触发断言错误。
  2. 重新赋值cap为第二个视频的捕获对象后,没有立即读取第二个视频的第一帧,而是继续使用之前读取失败的空frame进行显示。

修正方案

方案一:遍历视频列表(推荐,可扩展多视频)

import numpy as np
import cv2 as cv

# 定义要播放的视频序列
video_list = ['video.mp4', 'video2.mp4']

for video_path in video_list:
    cap = cv.VideoCapture(video_path)
    # 检查视频是否成功打开
    if not cap.isOpened():
        print(f"无法加载视频: {video_path}")
        continue
    
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break  # 当前视频播放完毕,切换下一个
        
        cv.imshow('frame', frame)
        # 按q键提前终止所有播放
        if cv.waitKey(1) == ord('q'):
            cap.release()
            cv.destroyAllWindows()
            exit()
    
    cap.release()

cv.destroyAllWindows()

方案二:手动处理视频切换

import numpy as np
import cv2 as cv

cap = cv.VideoCapture('video.mp4')

while True:
    ret, frame = cap.read()
    if not ret:
        # 释放当前视频资源,切换到第二个视频
        cap.release()
        cap = cv.VideoCapture('video2.mp4')
        # 检查第二个视频是否能正常打开
        if not cap.isOpened():
            print("第二个视频无法打开")
            break
        # 读取第二个视频的第一帧
        ret, frame = cap.read()
        if not ret:
            break  # 第二个视频无有效帧
    
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break

cap.release()
cv.destroyAllWindows()

修正说明

  • 两种方案都避免了用空帧调用imshow的问题,确保每次显示的都是有效视频帧。
  • 增加了视频打开失败的判断逻辑,避免因视频文件损坏或路径错误导致的异常。
  • 方案一的列表遍历方式更灵活,后续添加更多视频只需修改video_list即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:15:53