【问题标题】:Python OpenCV - Record fixed size videos from RSTP streamPython OpenCV - 从 RTSP 流录制固定大小的视频
【发布时间】: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 &lt; frames_per_video,而是检查时间。

问题

我想我可以降低帧速率,但这总是不同的,那么我该如何动态选择帧速率?或者如何更改实现以捕获所有帧?

或者我错过了什么?最终目标是制作 30 秒的视频,代表 30 秒的实时

谢谢!

【问题讨论】:

    标签: python opencv rtp


    【解决方案1】:

    推测你所看到的:

    • VP8 对您的计算机来说太多了,无法以这种帧速率和大小进行编码。使用更简单的编解码器,可能是 MJPG。
    • 可能网络摄像机以 30 fps 的速度发射视频

    在每一帧之前/之后从您的 VideoCapture 中获取 CAP_PROP_POS_MSEC 值,看看这些值是否对您有意义。

    您可能必须使用演示时间戳。这是可以在任意时间有帧的视频的“每秒帧数”的概括。某些相机在设置为各种“自动”设置时会改变其帧速率。

    OpenCV 不是媒体库。它的视频读写功能只是方便。您需要更强大的 API。

    考虑使用 ffmpeg 库。我承认这是一个复杂的 API,但它是必要的复杂性。 “PyAV”项目将 ffmpeg 正确包装到 python 中。每个其他“ffmpeg”python 包装器只运行一个子进程,它不会为您提供有关演示时间戳的信息。

    【讨论】:

    • 谢谢,我会调查你给我的建议。关于 PyAV/ffmpeg,主要问题是它们的许可证。对于商业产品(就像我正在做的那样),它非常严格,所以我不能使用它..
    • OpenCV 使用 ffmpeg,所以如果您认为 OpenCV 可以安全地用于商业用途(这是正确的),那包括它使用的所有库。您可能必须将相应的许可证与您的应用程序打包在一起才能遵守,也许更多,也许更少。
    猜你喜欢
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多