如何用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
相关产品推荐
相关产品推荐

