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

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

我有几个输出 RTSP(h264 mpeg4)流的 IP 摄像机。

通过 VLC 本地访问 URL:rtsp://192.168.0.21:554/mpeg4

我可以流式传输摄像机并将其转储到磁盘(在我的桌面上)。但是我想将这些文件存储在我的 NAS(FreeNAS)上。我正在寻找捕获 RTSP 流并将其转储到磁盘的方法,但我找不到任何东西。

是否可以在 FreeBSD 或 Linux(RaspberryPi)上捕获流并将流内容转储到 Linux 或 FreeBSD 本地磁盘 - 最好每 30 分钟一次?

编辑:NAS 是无头的(HP N55L 或类似产品),RaspberryPi 也是无头的。

我已经研究过 ZoneMinder,但需要一些小东西。我希望也许使用 Motion 来检测流中的运动,但这要等到以后才能实现。

答案1

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 客户端实例的标准输出,并检查文件大小是否持续增长。

这似乎是 CCTV 行业低端标准不严格的副产品,其中 RTSP 和 ONVIF 是最常被滥用的两个​​标准。

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

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

有一个名为 ZoneMinder 的开源项目可以完成后一部分,但我无法让它与我的相机配合使用。ZM 中对 ONVIF 的支持尚属新兴事物,而且它似乎无法很好地应对我的 100 美元以下 IP 相机产生的不稳定 RTSP 流。

答案2

如果我正确理解了您的问题,那么您为什么不在 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

我只是想发表一下我的意见并补充 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 将停止录制并保持打开状态。此命令需要放在循环内。

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

答案4

Shinobi 是一个“一体化”解决方案(捕获、显示、基于事件的录制……)。它有一个不错的基于 Web 的 GUI 和良好的性能。我将它与不同的 IP 摄像头一起使用。(h264 RTSP 流)

乌韦

相关内容