使用Python+OpenCV分割录制RTSP流生成无效文件的问题
问题修复方案
核心问题排查
- RTSP流临时中断导致程序提前退出:原代码中一旦
cap.read()返回False就直接终止循环,而RTSP流可能只是临时卡顿而非永久断开,此时刚创建的新视频文件因未写入任何有效帧,变成无法播放的6KB空文件。 - 缺少
cv2.waitKey()导致UI阻塞:cv2.imshow必须配合cv2.waitKey()使用,否则会导致主线程假死,干扰视频录制逻辑的正常执行。 - 文件切换逻辑未做容错处理:切换新文件时没有验证帧读取状态,可能在流异常时创建空文件。
修复后的代码
import numpy as np import cv2 import time def get_output(out=None): if out: out.release() # 生成带时间戳的文件名 filename = time.strftime('%d %m %Y - %H %M %S') + '.avi' # 初始化VideoWriter,使用MJPG编码 return cv2.VideoWriter(filename, cv2.VideoWriter_fourcc(*'MJPG'), 24, (320,240)) # 初始化RTSP流 cap = cv2.VideoCapture("rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4") # 设置首次切换文件时间 next_time = time.time() + 60 out = get_output() while True: # 读取帧 ret, frame = cap.read() # 处理流异常:重试读取,而非直接退出 if not ret: print("流读取失败,重试中...") time.sleep(1) cap = cv2.VideoCapture("rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4") continue # 检查是否需要切换文件 if time.time() > next_time: next_time += 60 out = get_output(out) # 写入帧并显示 out.write(frame) cv2.imshow('Frame', frame) # 处理按键事件,同时避免UI阻塞 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放资源 cap.release() out.release() cv2.destroyAllWindows()
关键修改点
- 流异常容错:当
cap.read()失败时,重新初始化VideoCapture并重试,而非直接终止程序 - 添加
cv2.waitKey(1):解决cv2.imshow导致的主线程阻塞问题,同时支持按q键手动退出 - 调整文件切换时机:确保读取到有效帧后再判断是否切换文件,避免在流异常时创建空文件
- 显式释放最后一个VideoWriter:原代码中未释放循环结束时的
out,修复后确保所有文件都正确收尾
内容的提问来源于stack exchange,提问作者CDN
相关产品推荐
相关产品推荐

