python使用opencv读取rtsp直播流并控制延迟

您所在的位置:网站首页 python读取rtsp流 python使用opencv读取rtsp直播流并控制延迟

python使用opencv读取rtsp直播流并控制延迟

2024-01-02 23:42| 来源: 网络整理| 查看: 265

本文场景为ffmpeg推流到rtsp服务器,另一客户端使用opencv读取并执行其他图像处理操作,但是图像处理速度比较慢导致延迟越来越大,因此需要跳帧来控制延迟。

ffmpeg推流命令:

ffmpeg -re -stream_loop -1 -i test2.mp4 -c copy -f rtsp rtsp://127.0.0.1:8554/test

-re 表示与推流速度与视频同步,如果编码速度跟不上视频速度,建议换台机器,或者降低分辨率,-stream_loop -1 表示循环次数无限(此处使用视频测试,实际推流去掉即可),实际使用时也可以使用 opencv 通过 pipe 推流,写 -i -,其他参数见 ffmpeg -h,另自备 rtsp 服务器。

以下代码适用于图像处理时间大于帧时间时,如果不跳帧则会导致延迟越来越大,根据延迟判断是否需要跳帧即可。

import cv2 from time import time, sleep import logging def process(): # 模拟图像处理耗时 sleep(0.03) logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s", datefmt="%Y/%m/%d %H:%M:%S") # 打开直播流 cap = cv2.VideoCapture("rtsp://127.0.0.1:8554/test") fps = 30 # 直播流帧率 maxDelay = 0.5 # 最大容许延时 startTime = time() # 开始时间 frames = 0 logging.info("已连接") while True: frames += 1 ret, frame = cap.read() # 延时小于最大容许延时才进行识别 if frames > (time()-startTime-maxDelay)*fps: process() cv2.imshow("frame", frame) else: logging.info(f"已跳过一帧,当前{frames},期望{int((time()-startTime-maxDelay)*fps)}") # 按q退出 if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows() cap.release()

本文已参与「新人创作礼」活动,一起开启掘金创作之路



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3