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

使用Python+OpenCV分割录制RTSP流生成无效文件的问题

问题修复方案

核心问题排查

  1. RTSP流临时中断导致程序提前退出:原代码中一旦cap.read()返回False就直接终止循环,而RTSP流可能只是临时卡顿而非永久断开,此时刚创建的新视频文件因未写入任何有效帧,变成无法播放的6KB空文件。
  2. 缺少cv2.waitKey()导致UI阻塞:cv2.imshow必须配合cv2.waitKey()使用,否则会导致主线程假死,干扰视频录制逻辑的正常执行。
  3. 文件切换逻辑未做容错处理:切换新文件时没有验证帧读取状态,可能在流异常时创建空文件。

修复后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:06:17