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

如何用OpenCV Python按列表循环播放视频流各60秒?

解决方案

核心思路是基于系统时间计算播放时长,而非依赖视频本身的长度,同时避免用time.sleep()阻塞帧刷新,确保视频流正常显示的同时,到点自动切换。

完整代码示例

import cv2
import time

# 摄像头列表:(名称, 视频地址),支持RTSP流、本地视频文件
camera_list = [
    ("入口摄像头", "rtsp://your-rtsp-url-1"),
    ("大厅摄像头", "rtsp://your-rtsp-url-2"),
    ("仓库摄像头", "./warehouse.mp4")
]

current_idx = 0
total_cams = len(camera_list)

while True:
    cam_name, cam_url = camera_list[current_idx]
    # 初始化视频捕获对象
    cap = cv2.VideoCapture(cam_url)
    
    if not cap.isOpened():
        print(f"⚠️ 无法连接到 {cam_name},跳过")
        current_idx = (current_idx + 1) % total_cams
        continue
    
    start_ts = time.time()
    print(f"▶️ 开始播放 {cam_name},将持续60秒")
    
    # 当前摄像头的播放循环
    while True:
        ret, frame = cap.read()
        if not ret:
            # 视频流中断,直接切换
            print(f"❌ {cam_name} 流中断,切换下一个")
            break
        
        # 叠加摄像头名称到画面
        cv2.putText(frame, cam_name, (15, 40), cv2.FONT_HERSHEY_DUPLEX, 1.2, (0, 255, 255), 2)
        cv2.imshow("监控流", frame)
        
        # 检查是否达到60秒播放时长
        if time.time() - start_ts >= 60:
            break
        
        # 处理按键:按q退出程序
        if cv2.waitKey(1) & 0xFF == ord('q'):
            cap.release()
            cv2.destroyAllWindows()
            exit()
    
    # 释放当前摄像头资源
    cap.release()
    # 切换到下一个,循环往复
    current_idx = (current_idx + 1) % total_cams

# 程序退出时清理窗口
cv2.destroyAllWindows()

关键细节说明

  • 定时逻辑:用time.time()记录播放起始时间,每次帧循环计算已流逝时间,达到60秒就跳出当前播放循环,不会等待视频播放完毕
  • 避免卡顿:cv2.waitKey(1)负责处理窗口事件和刷新画面,绝对不能用time.sleep()替代——sleep会阻塞线程,导致画面冻结无响应
  • 异常兼容:如果摄像头无法连接(网络故障、地址错误),会自动跳过并切换到下一个,保证循环不中断
  • 退出机制:按下q键可立即终止程序,解决无限循环无法手动停止的问题
  • 循环切换:通过(current_idx + 1) % total_cams实现列表循环,播放完最后一个摄像头后自动回到第一个

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:06:17