【发布时间】:2020-12-04 20:41:22
【问题描述】:
早上好/下午/晚上,
我正在学习如何在 Python 中使用 OpenCV,但我遇到了一些问题,我相信我在拼图中遗漏了一些部分。
设置
一个 IP 摄像机 (Bosh FLEXIDOME IP micro 5000) 和我的笔记本电脑连接到一个 PoE 交换机,连接到我的主路由器。
我想要达到的目标
我需要从摄像机录制固定长度的视频(使用 RSTP)。例如,录制 30 秒的视频,保存,重新开始。我正在使用 VP80,因为它是免版税的。
问题
我正在根据相机的规格对 fps 进行硬编码。它说它可以从 25 fps 开始录制,所以我选择了这个数字。我想要 30 秒的视频。
我尝试了两种方法,但主要问题是 python 循环捕获帧无法达到 25fps 所需的速度。
方法一
我计算了制作 30 秒视频需要捕获的帧数。 frames_per_seconds = fps * clip_duration_in_seconds
我循环并捕获帧,直到获得所需的帧数,然后保存视频。
这给了我 30 秒的视频(很好!)在几分钟内(?)
import cv2
import os
import time
from datetime import datetime
import sys
cap = cv2.VideoCapture('rtsp://192.168.178.157:554/?fmt=3')
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = 25
size = (width, height)
clip_duration_in_seconds = 5
frames_per_video = clip_duration_in_seconds * fps
if (cap.isOpened()== False):
raise("Error opening video stream or file")
while(True):
start = datetime.now().strftime("%d-%m-%Y_%H.%M.%S")
output_file = f"Output_{start}.mkv"
out = cv2.VideoWriter(
output_file, cv2.VideoWriter_fourcc(*'VP80'), fps,
size)
frame_count = 0
while(cap.isOpened() and frame_count < frames_per_video):
ret, frame = cap.read()
if ret == True:
out.write(frame)
frame_count = frame_count + 1
else:
raise("Broken stream")
out.release()
方法2
使用time.time() 检查是否已经过了 30 秒。结果是 1-3 秒的时间流逝。代码和以前一样,但不是检查frame_count < frames_per_video,而是检查时间。
问题
我想我可以降低帧速率,但这总是不同的,那么我该如何动态选择帧速率?或者如何更改实现以捕获所有帧?
或者我错过了什么?最终目标是制作 30 秒的视频,代表 30 秒的实时。
谢谢!
【问题讨论】: