2014-06-09 08:56:55 +0000 2014-06-09 08:56:55 +0000
18
18

擷取網路攝影機的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来检测流上的运动,但这将在以后。

答案 (4)

30
30
30
2015-05-29 22:33:16 +0000

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中使用 “subprocesses "模块来编写一个控制器,以调用和监视每个openRTSP客户端实例的stdout,同时检查文件是否在继续增长。

这似乎是CCTV行业低端产品在标准上玩得过快过松的副产品,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流相抗衡。

7
7
7
2017-06-26 12:49:23 +0000

如果我对你的问题理解正确的话,你为什么不在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秒的片段。(请注意,剪辑长度将取决于你的输入和输出帧率)

7
7
7
2015-04-01 22:52:30 +0000

我只是想补充一下我的观点,补充一下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会停止录制并保持打开状态。这个命令需要放在一个循环中。

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

5
5
5
2014-06-09 12:06:59 +0000

VLC看起来像一个理想的候选人来处理你的流[基本的方法来捕获一个流]0x3&在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上,只要把它挂载到你的本地文件系统就可以了。