import cv2
import json
import time # 用于替代 cv2.waitKey 的延迟
def rtsp_mp4():
with open('demo.json', 'r', encoding='utf-8') as fp:
opt = json.load(fp)
# 获取视频流地址
cap = cv2.VideoCapture(opt["source"])
# 帧数
fps = cap.get(cv2.CAP_PROP_FPS)
# 宽高
width, height = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
size = (width, height)
# 定义视频编码方式,保存为mp4文件
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
out = cv2.VideoWriter()
# 视频存储对象,视频格式,帧数,视频大小
out.open(opt["video_name"], fourcc, fps, size)
try:
while True:
# 获取每一帧
ref, frame = cap.read()
# 若没有帧返回,则重新刷新rtsp视频流
while not ref:
cap.release() # 先释放之前的资源
cap = cv2.VideoCapture(opt["source"])
ref, frame = cap.read()
time.sleep(0.1) # 避免高频重连
continue
# 翻转(如果需要)
#frame = cv2.flip(frame, 1)
# 保存每一帧
out.write(frame)
# 替代 GUI 的退出条件:按时间或帧数限制
# 例如:录制 10 秒后自动停止
if time.time() - start_time > 10: # 自定义时间
break
except KeyboardInterrupt:
print("用户手动终止录制")
finally:
# 释放资源
cap.release()
out.release()
print(f"视频已保存到: {opt['video_name']}")
if __name__ == "__main__":
start_time = time.time() # 记录开始时间
rtsp_mp4()
demo.json内容:
{
"source":"rtsp://admin:oetsky@2023@10.16.11.112/streaming/channels/101",
"video_name": "demo.mp4"
}