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()