Kee*_*thi 23 linux freenas camera video-streaming 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 来检测流上的运动,但稍后会出现。
小智 34
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
Run Code Online (Sandbox Code Playgroud)
这些选项意味着:
-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
Run Code Online (Sandbox Code Playgroud)
删除 -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 的开源项目可以完成后面的部分,但我无法在我的相机上使用它。ONVIF 支持在 ZM 中是新的和新生的,它似乎不能很好地与我的 100 美元以下 IP 摄像机的动物园产生的参差不齐的 RTSP 流抗衡。
小智 11
如果我正确地回答了您的问题,为什么不在 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"
Run Code Online (Sandbox Code Playgroud)
这应该以 300 秒的块保存视频。(请注意,剪辑长度将取决于您的输入和输出帧速率)
小智 8
我只是想我会加上我的两分钱并补充 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
Run Code Online (Sandbox Code Playgroud)
这会在指定的时间内运行 VLC,然后退出。vlc://quit 参数是必需的,因为 VLC 将停止录制并保持打开状态。这个命令需要放在一个循环中。
到目前为止,我发现的唯一问题是每次开始新录音时可能会错过几秒钟。
小智 6
VLC 看起来是处理流的理想选择。 Videolan 网站上描述了捕获流的基本方法。我使用以下命令成功记录了我的 D-Link DCS-5222 网络摄像机的输出:
vlc rtsp://user:password@ip/play1.sdp --sout=file/ogg:mystream.ogv
Run Code Online (Sandbox Code Playgroud)
在您的情况下,这可能有助于在本地保存输出:
vlc rtsp://192.168.0.21:554/mpeg4 --sout=file/ts:mystream.mpg
Run Code Online (Sandbox Code Playgroud)
我建议运行一个脚本来结束这个 vlc 进程并每 30 分钟启动一个新实例,因为我不确定 VLC 是否能够做到这一点。
至于存储在 NAS 上,只需将其挂载到本地文件系统即可。