使用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()
错误原因
- 当第一个视频读取到末尾时,
ret变为False,此时frame是无效的空帧,但代码紧接着执行cv.imshow('frame', frame),空帧不满足imshow的尺寸要求,直接触发断言错误。 - 重新赋值
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
相关产品推荐
相关产品推荐

