題 從IP Camera捕獲RTSP流並存儲


我有幾台IP攝像機輸出RTSP(h264 mpeg4)流。

通過VLC在本地訪問URL: RTSP://192.168.0.21:554 / MPEG4

我可以流式傳輸相機並轉儲到磁盤(在我的桌面上)。但我想將這些文件存儲在我的NAS(FreeNAS)上。我正在尋找捕獲RTSP流並將其轉儲到磁盤的方法,但我找不到任何東西。

是否有可能在FreeBSD或Linux(RaspberryPi)上捕獲流並將流內容轉儲到Linux或FreeBSD本地的磁盤上 - 最好每30分鐘一次?

編輯: NAS是無頭的(HP N55L或其他東西),RaspberryPi也是無頭的。

我已經研究過ZoneMinder但需要一些小東西。我希望可能會使用Motion來檢測流上的運動,但這會在稍後發生。


13
2018-06-09 08:56


起源


為什麼不在Linux上使用VLC? - LatinSuD
哎呀,我忘了提到FreeNAS服務器和RaspberryPi都是無頭的!
您可以從命令行使用VLC。不是微不足道的,但可能。 - LatinSuD
由於RTSP只是一個協議,它只是轉儲h264內容還是我必須讓VLC轉碼?
那是VLC命令行伏都教的一部分,對不起,這就是為什麼我不在這裡給你一個完整的答案。我認為完全轉碼不是必要的,但可能會改變容器。我希望有一些VLC專家在這裡出現。 - LatinSuD


答案:


IP攝像機的質量各不相同,有些在我的經驗中表現不正常。處理其RTSP流需要一定的容錯能力。

Live555項目提供了一個相對容錯的RTSP客戶端實現openRTSP,用於通過CLI提取RTSP音頻/視頻流: http://www.live555.com/openRTSP/

例如,要將攝像機的RTSP音頻/視頻保存為QuickTime格式的文件(AVI和MP4也可用),每15分鐘一個文件:

$ openRTSP -D 1 -c -B 10000000 -b 10000000 -q -Q -F cam_eight -d 28800 -P 900 -t -u admin 123456 rtsp://192.168.1.108:554/11

這些選項意味著:

-D 1 # Quit if no packets for 1 second or more
-c   # Continuously record, after completion of -d timeframe
-B 10000000 # Input buffer of 10 MB
-b 10000000 # Output buffer 10MB (to file)
-q   # Produce files in QuickTime format
-Q   # Display QOS statistics 
-F cam_eight  # Prefix output filenames with this text
-d 28800      # Run openRTSP this many seconds
-P 900        # Start a new output file every -P seconds
-t            # Request camera end stream over TCP, not UDP
-u admin 123456  # Username and password expected by camera
rtsp://192.168.1.108:554/11  # Camera's RTSP URL

刪除-t選項會導致openRTSP默認為UDP,這可以減少網絡流量。您需要使用選項才能找到適合您的組合。

坦率地說,相機本身有時不可靠,或者只是實施 不同 像意外關閉套接字並不是那麼不尋常。

有時openRTSP客戶端不會捕獲這些故障。因此,我選擇使用'subprocesses'模塊在Python中編寫控制器來調用和監視每個openRTSP客戶端實例的stdout,並檢查文件是否繼續增大。

這似乎是中央電視台低端市場的副產品,其標準是快速和寬鬆,RTSP和ONVIF是最常被濫用的兩種。

幸運的是,您通常可以解決這些問題。除非您的IP攝像機和控制器都設計為可以很好地協同工作,否則只能使用ONVIF進行一次性發現和設置管理。

我在一些運行Raspbian的Raspberry Pi B +上使用openRTSP。每個1280x1024流佔用CPU時間的大約8-10%,並且每個RPi成功運行多達8個攝像頭,將文件寫入NAS存儲。另一個RPi使用ffmpeg處理已完成的文件,搜索運動並生成這些幀的索引PNG,以幫助發現入侵。

有一個名為ZoneMinder的開源工作,它執行後一部分,但我無法使用我的相機。 ONVIF支持在ZM中是新的和新生的,它似乎與我的100美元以下IP攝像機的動物群產生的不穩定的RTSP流不太相配。


20
2018-05-29 22:33



偉大的解決方案凱文,您能否與運動搜索/ png索引解決方案分享更多信息 - 至少在哪裡可以進一步挖掘? - Igor
@ Kevin-Prichard我想了解,1。如果我可以將模擬SD CVSB轉換為IP流,您的解決方案是否有效? (我希望從每個來源以1小時的時間段捕獲mp4視頻)並且我能夠通過一個網絡全天候記錄300個這樣的流,還是會使網絡過載? 2.是否可以將模擬SD / CVSB轉換為IP流? - CP3O


我只是想加上我的兩分錢並補充BjornR的答案。

可以告訴VLC運行指定的時間並在之後關閉,而不是運行cron作業來定期終止VLC進程。

這是我在我的盒子上運行的命令:

/usr/bin/vlc -vvv rtsp://192.168.1.128:1554/11 --sout=file/ts:/media/path/to/save/location/recording-$(date +"%Y%m%d%H%M%S").ts -I dummy --stop-time=480 vlc://quit

這將在指定的時間內運行VLC,然後退出。 vlc:// quit參數是必需的,因為VLC將停止錄製並保持打開狀態。此命令需要放在循環中。

到目前為止,我發現的唯一問題是,每次新錄製開始時可能會錯過幾秒鐘。


6
2018-04-01 22:52





VLC看起來像是處理流的理想候選者。 捕獲流的基本方法 在Videolan網站上有描述。 我使用以下命令成功記錄了D-Link DCS-5222網絡攝像機的輸出:

vlc rtsp://user:password@ip/play1.sdp --sout=file/ogg:mystream.ogv

在您的情況下,這可能會在本地保存輸出:

vlc rtsp://192.168.0.21:554/mpeg4 --sout=file/ts:mystream.mpg

我建議運行一個腳本來結束這個vlc進程並每30分鍾啟動一個新實例,因為我不確定VLC能夠做到這一點。

至於在NAS上存儲,只需將其安裝到本地文件系統即可。


4
2018-06-09 12:06



您也可以使用FFMPEG完成相同的工作。根據答案的建議,您仍然需要安裝NAS。 - Kinnectus


如果我正確地按照您的問題,為什麼不在Linux系統(RPi)上嘗試以下命令:

ffmpeg -i rtsp://192.168.0.21:554/mpeg4 -vcodec copy -acodec copy -map 0 -f segment -segment_time 300 -segment_format mp4 "ffmpeg_capture-%03d.mp4"

這應該以300秒的塊為單位保存視頻。 (請注意,剪輯長度取決於您的輸入和輸出幀速率)


3
2018-06-26 12:49