从IP摄像机捕获RTSP流并存储


18

我有一些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来检测流中的运动,但是稍后会出现。


为什么不为Linux使用VLC?
LatinSuD 2014年

1
糟糕,我忘了提及FreeNAS服务器和RaspberryPi都是无头的!

您可以从命令行使用VLC。不平凡,但可能。
LatinSuD 2014年

由于RTSP只是一个协议,它会只是转储h264内容还是我必须让VLC对其进行转码?

1
好吧,这是VLC命令行伏都教的一部分,对不起,这就是为什么我在这里没有给您完整的答案。我认为完全没有必要进行代码转换,但可以更改容器。我希望这里有一些VLC专家。
LatinSuD 2014年

Answers:


29

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客户端无法捕获这些故障。因此,我选择使用“子进程”模块在Python中编写一个控制器,以调用和监视每个openRTSP客户端实例的标准输出,并检查文件的大小是否继续增长。

这似乎是闭路电视行业低端市场迅速而宽松地采用标准的副产品,RTSP和ONVIF是最常被滥用的两个​​标准。

幸运的是,您通常可以解决这些问题。除非您的IP摄像机和控制器都设计为可以很好地配合使用,否则请仅使用ONVIF进行仅一次的发现和设置管理。

我在一些运行Raspbian的Raspberry Pi B +上使用openRTSP。每个1280x1024的流占用CPU时间的8-10%,并且我已经成功地为每个RPi运行多达八台摄像机,并将文件写入NAS存储。另一个RPi使用ffmpeg处理完成的文件,搜索运动并生成这些帧的索引PNG,以帮助发现入侵。

后一部分要做一个名为ZoneMinder的开源工作,但是我无法在我的相机上使用它。ZM中对ONVIF的支持是新的和新生的,而且与我的不足100美元的IP摄像机的管理者所产生的RTSP流似乎并不完美。


很棒的解决方案Kevin,请您分享一下运动搜索/ png索引解决方案的更多信息-至少在哪里可以继续研究?
伊戈尔2015年

我想了解@@ Kevin-Prichard,1.如果可以将模拟SD CVSB转换为IP流,您的解决方案是否可行?(我想从每个来源中以1小时的时间段捕获mp4视频)我是否能够在24/7的单个网络上录制300个此类流,或者这会使网络过载?2.是否可以将模拟SD / CVSB转换为IP流?
CP3O

7

我只是以为我要加两分钱,补充BjornR的回答。

而不是运行cron作业来定期终止VLC进程,而是可以告诉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会停止记录并保持打开状态。该命令需要放在循环中。

到目前为止,我发现的唯一问题是每次开始新录制时,它可能会错过几秒钟。


7

如果我正确地遵循了您的问题,为什么不在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秒。(请注意,片段长度将取决于您的输入和输出帧速率)


5

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上,只需将其安装到本地文件系统上即可。


1
您还可以使用FFMPEG来完成完全相同的工作。您仍然需要按照答案提示安装NAS。
Kinnectus 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.