簡體   English   中英

如何根據觸發器將 RTSP stream 緩沖並捕獲到磁盤?

[英]How do I buffer and capture an RTSP stream to disk based on a trigger?

我想我要問的類似於這篇關於如何捕捉雷擊的 ffmpeg 帖子( https://trac.ffmpeg.org/wiki/Capture/Lightning

我有一個帶有 IP cam over RTSP 的 Raspberry Pi,我想知道如何保持連續 5 秒的實時視頻緩沖區,直到我觸發一個“保存”命令,該命令將 pipe 5 秒緩沖到磁盤,然后繼續將實時視頻流式傳輸到磁盤,直到我將其關閉。

本質上,Pi 啟動,這個神奇的黑盒進程開始並將實時視頻保存到一個固定大小的 5 秒緩沖區,然后假設一個小時后 - 我單擊一個按鈕,它會將 5 秒緩沖區刷新到磁盤上的文件並繼續將 pipe 視頻到磁盤,直到我單擊取消。

在我的環境中,我可以使用 ffmpeg、gstreamer 或 openRTSP。 對於其中的每一個,我都可以連接到我的 RTSP stream 並將其保存到磁盤,但我不確定如何創建這個永遠存在的 5 秒緩存。

我覺得 gstreamer 文檔在這里暗指它( https://gstreamer.freedesktop.org/documentation/application-development/advanced/buffering.html?gi-language=c ),但我想我只是沒有抱怨緩沖如何適應觸發的保存。 從那篇文章中,我得到的印象是視頻的結束時間是提前知道的(我想我可以人為地限制我的)。

我不是在一個很棒的 position 對文件進行后處理,所以使用 openRTSP 之類的東西,保存一大堆視頻片段,然后合並它們並不是一個真正的選擇。

注意:成功保存后,我不需要再保存一分鍾左右的視頻,這樣 5 秒的緩存就有足夠的時間在下一次之前填滿

這是我發現的最接近的類似問題: https://video.stackexchange.com/questions/18514/ffmpeg-buffered-recording

嘿,

我不知道你是否有關於 python 的知識,但是有一個名為 pyav 的庫,它是一個用於 ffmpeg 的精美 python 包裝器/接口。

在那里,您可以從 RTSP 源中讀取幀並根據需要處理這些幀。

這只是關於你所描述的想法/黑客實現,你需要設計你的幀緩沖區。 當您知道您從相機獲得 25 FPS 時,您可以將隊列大小限制為 125。

import av
import time
import queue
from threading import Thread, Event


class LightingRecorder(Thread):

    def __init__(self, source: str = ""):
        Thread.__init__(self)
        self.source = source
        self.av_instance = None
        self.connected = False
        self.frame_buffer = queue.Queue()
        self.record_event = Event()

    def open_rtsp_stream(self):
        try:
            self.av_instance = av.open(self.source, 'r')
            self.connected = True
            print ("Connected")
        except av.error.HTTPUnauthorizedError:
            print ("aHTTPUnauthorizedError")
        except Exception as Error:
            # Catch other pyav errors if you want, just for example
            print (Error)

    def run(self):
        self.open_rtsp_stream()

        while 1:
            if self.connected:
                for packet in self.av_instance.demux():
                    for frame in packet.decode():
                        if packet.stream.type == 'video':
                            # TODO:
                            # Handle clearing of Framebuffer, remove frames that are older as a specific timestamp
                            # Or calculate FPS per seconds and store that many frames on framebuffer
                            print ("Add Frame to framebuffer", frame)
                            self.frame_buffer.put(frame)

                        if self.record_event.is_set():
                            [frame.to_image().save('frame-%04d.jpg' % frame.index) for frame in self.frame_buffer]
            else:
                time.sleep(10)

LightingRecorder(source='rtsp://root:pass@192.168.1.197/axis-media/media.amp').start()

iSpy/AgentDVR 可以完全滿足您的需求https://www.ispyconnect.com/userguide-recording.aspx

緩沖區:這是 memory 中要緩沖的視頻秒數。 此功能使 iSpy 能夠捕獲導致運動檢測事件的完整事件。

編輯:iSpy 只在 Windows 上運行,不像 AgentDVR,它也有 Linux/OSX/RPi 版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM