工作中遇到截取rtsp视频流的任务,多个摄像头,需要多开几个线程同时截取。于是有的这个程序
import cv2
import os
import threading
import time
from datetime import datetime
def capture_rtsp_stream(rtsp_url, output_folder):
cap = cv2.VideoCapture(rtsp_url)
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))
original_frame_rate = cap.get(cv2.CAP_PROP_FPS) # 获取原始帧率
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 创建具有原始帧率的输出视频文件
video_file_path = os.path.join(output_folder, f'output_{datetime.now().strftime("%Y%m%d_%H%M%S")}.avi')
out = cv2.VideoWriter(video_file_path, fourcc, original_frame_rate, (frame_width, frame_height))
start_time = time.time()
while time.time() - start_time < 20:
ret, frame = cap.read()
if not ret:
print(f"Failed to read frame from {rtsp_url}.")
break
# 将帧保存到输出视频文件中
out.write(frame)
# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
def main():
# 设置4个RTSP流地址
rtsp_urls = [
"rtsp:/",
"rtsp://",
"rtsp:",
"rtsp:",
]
# 设置4个输出文件夹路径
output_folders = [
r"C:\",
r"C:\\",
r"C:\",
r"C:\\",
]
threads = []
# 启动多线程进行视频截取
for i in range(4):
thread = threading.Thread(target=capture_rtsp_stream, args=(rtsp_urls[i], output_folders[i]))
threads.append(thread)
# 启动线程
for thread in threads:
thread.start()
# 等待所有线程完成
for thread in threads:
thread.join()
if __name__ == "__main__":
main()