86 lines
2.7 KiB
Python
86 lines
2.7 KiB
Python
import cv2
|
|
import datetime
|
|
import os
|
|
|
|
def save_rtsp_to_video(rtsp_url, output_dir='output', duration_minutes=10):
|
|
"""
|
|
将RTSP流保存为视频文件
|
|
|
|
参数:
|
|
rtsp_url: RTSP流地址
|
|
output_dir: 输出目录
|
|
duration_minutes: 每个视频文件的时长(分钟)
|
|
"""
|
|
# 创建输出目录
|
|
os.makedirs(output_dir, exist_ok=True)
|
|
|
|
# 打开RTSP流
|
|
cap = cv2.VideoCapture(rtsp_url)
|
|
|
|
if not cap.isOpened():
|
|
print("无法打开RTSP流")
|
|
return
|
|
|
|
# 获取视频的帧率和尺寸
|
|
fps = int(cap.get(cv2.CAP_PROP_FPS))
|
|
if fps <= 0:
|
|
fps = 25 # 默认帧率
|
|
|
|
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
|
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
|
|
# 计算最大帧数(按duration_minutes分钟分割)
|
|
max_frames = fps * 60 * duration_minutes
|
|
|
|
frame_count = 0
|
|
file_count = 1
|
|
|
|
# 创建第一个视频文件
|
|
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
output_file = os.path.join(output_dir, f"video_{timestamp}_part{file_count}.mp4")
|
|
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 或者使用'avc1'
|
|
out = cv2.VideoWriter(output_file, fourcc, fps, (frame_width, frame_height))
|
|
|
|
print(f"开始录制,保存到: {output_file}")
|
|
|
|
try:
|
|
while True:
|
|
ret, frame = cap.read()
|
|
|
|
if not ret:
|
|
print("无法获取帧,可能流已断开")
|
|
break
|
|
|
|
# 写入帧
|
|
out.write(frame)
|
|
frame_count += 1
|
|
|
|
# 如果达到最大帧数,创建新文件
|
|
if frame_count >= max_frames:
|
|
out.release()
|
|
file_count += 1
|
|
frame_count = 0
|
|
|
|
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
output_file = os.path.join(output_dir, f"video_{timestamp}_part{file_count}.mp4")
|
|
out = cv2.VideoWriter(output_file, fourcc, fps, (frame_width, frame_height))
|
|
print(f"创建新文件: {output_file}")
|
|
|
|
# # 按q键退出(需要显示窗口时才有效)
|
|
# if cv2.waitKey(1) & 0xFF == ord('q'):
|
|
# break
|
|
|
|
except KeyboardInterrupt:
|
|
print("用户中断录制")
|
|
finally:
|
|
cap.release()
|
|
out.release()
|
|
# cv2.destroyAllWindows()
|
|
print("录制结束")
|
|
|
|
if __name__ == "__main__":
|
|
# 示例RTSP URL - 替换为你的实际RTSP地址
|
|
rtsp_url = "rtsp://10.0.0.61/live/video6"
|
|
|
|
# 调用函数开始录制
|
|
save_rtsp_to_video(rtsp_url, duration_minutes=10) |