使用ffmpeg实现一个简单NVR

date
Jul 3, 2023
slug
使用ffmpeg实现一个简单NVR
status
Published
tags
开发相关
summary
type
Post
家里正在用的有个TP-Link和水星的监控摄像头,一直苦于每个摄像头都要插一张内存卡来保存监控视频非常麻烦,而且查看视频也不方便,不同厂商还要使用不同的APP查看。幸好摄像头都有开放onvif/RTSP协议,可以折腾一下。由于我有NAS,系统是ubuntu 18.04,盘位也够多,便想通过nas实现多路录像+储存。
首先获取到每个摄像头的RTSP拉流地址,水星和TP-Link的摄像头RTSP地址格式为:
摄像头重启可能IP地址会发生变化,所以需要路由器上进行ARP绑定。
 
在ubuntu上先安装ffmpeg:
然后使用ffmpeg把流转换成文件:
命令解释:
  1. /usr/bin/ffmpeg: 这里使用ffmpeg的绝对路径。
  1. i "rtsp://192.168.1.230/stream1": 这是输入选项,表示要从给定的RTSP URL(实时流传输协议)读取数据。
  1. c copy: 这是编解码选项,告诉FFmpeg在复制数据时不进行重新编码。这里摄像头使用的是h.256编码比较省内存,所以不转码。
  1. f segment: 这是输出格式选项,指示FFmpeg将输出数据分割为多个分段。
  1. reset_timestamps 1: 这个选项告诉FFmpeg在每个分段的开头重置时间戳,以便保持时间戳的连续性。
  1. strftime 1: 这个选项指示FFmpeg在生成分段文件名时使用时间格式。%Y%m%d%H-%M-%S会被替换为当前的年、月、日、小时、分钟和秒。
  1. segment_time 60: 这个选项规定了每个分段的时间长度,这里设置为60秒。
  1. segment_list "/srv/ST500DM002-500G/阳台/segments.txt": 这个选项指定了一个包含分段信息的文件的路径。在这个文件中,将记录每个生成的分段文件的名称。
  1. segment_list_size 10080: 这个选项规定了分段列表文件(segments.txt)中保留的最大分段条目数。在这里,最多会记录10080个分段条目,超过这个数量后,旧的分段信息将被删除。这个可以适当调低点,或者不要,用处不大,删掉旧的条目不会删除对应保存的文件,只会删除列表中的选项。要控制所有视频的大小需要ShellScript配合。
  1. %Y%m%d%H-%M-%S.mkv: 这是分段文件的命名模式。%Y%m%d%H-%M-%S会被当前的年、月、日、小时、分钟和秒替换,然后加上".mkv"作为文件扩展名。这就是生成的分段文件的名称。
 
把以上命令转换成systemd服务:
写入以下内容:
启动服务:
 
视频文件不能一直存,会爆盘,需要使用ShellScript控制保存视频的大小;这里我控制保存所有视频的总大小。
 
Done!

© Ryan Tang 2021 - 2025