系统改名为:,升级包改使用jpg图像封装,从2.124版本开始,1.*的升级包停止使用
系统工具 下载地址(2019-04-19) :https://pan.baidu.com/s/1kPZC38jPrZ4xWbSCplomuQ 提取码:39wg
升级包(fs-2.124.1038)下载地址(2019-04-19):https://pan.baidu.com/s/1PhjqtoHeqENI0ERA8aMm3w 提取码:g7so
升级包(1.78)下载地址(2017-04-10):http://pan.baidu.com/s/1i5ieCFr 新功能:增加阿里云oss储存回放的支持
升级包(1.78)下载地址(2017-04-10):http://pan.baidu.com/s/1i5ieCFr 新功能:增加阿里云oss储存回放的支持;
客户端工具下载地址(2017-04-10):http://pan.baidu.com/s/1c2Omp5u
升级包(1.77)下载地址(2017-03-31):http://pan.baidu.com/s/1qY6Sr4C 新功能:增加rtmp采集模块,支持按需拉流,支持相机轮巡检查相机状态;
升级包(1.76)下载地址(2017-03-04):http://pan.baidu.com/s/1i4NdQol 关键更新:hls服务端极限优化,vlc实测直播最小延时小于1S,让web直播互动成为可能;
升级包(1.75)下载地址(2017-02-22):http://pan.baidu.com/s/1boRto4Z
升级包(1.74)下载地址(2017-02-13):http://pan.baidu.com/s/1slat8Pv
升级包(1.73)下载地址(2017-01-11):http://pan.baidu.com/s/1bptbt07
升级包(1.72)下载地址(2017-01-10):http://pan.baidu.com/s/1pKEHoMn
客户端工具下载地址(2017-01-10):http://pan.baidu.com/s/1miLjnCW
升级包(1.71)下载地址(2017-01-09):http://pan.baidu.com/s/1geJHlLp
客户端工具下载地址(2017-01-02):https://pan.baidu.com/s/1nvJKMJR
升级包(1.69)下载地址(2016-12-07):http://pan.baidu.com/s/1c1DFPG8
升级包(1.68)下载地址(2016-12-02):http://pan.baidu.com/s/1i5v4EHZ
升级包(1.65)下载地址(2016-11-01):http://pan.baidu.com/s/1qYbCaNa
客户端工具下载地址(2016-11-01):http://pan.baidu.com/s/1pL4Kpp5
升级包(1.64)下载地址(2016-10-28):http://pan.baidu.com/s/1qXUQmy4
客户端工具下载地址(2016-10-27):http://pan.baidu.com/s/1cd0pBo
升级包(1.63)下载地址(2016-10-18):https://pan.baidu.com/s/1jIM4CRW
客户端工具下载地址(2016-10-18):https://pan.baidu.com/s/1c20wkCS
客户端工具下载地址(2016-10-11):https://pan.baidu.com/s/1kUP9OgB
客户端工具下载地址(2016-10-10):https://pan.baidu.com/s/1skYQYQD
客户端工具下载地址(2016-09-28):https://pan.baidu.com/s/1c2FUoY8
升级包(1.61)下载地址(2016-09-28):https://pan.baidu.com/s/1pLrRsan
客户端工具下载地址(2016-09-27):http://pan.baidu.com/s/1boEufGb
升级包(1.60)下载地址(2016-09-27):http://pan.baidu.com/s/1nvfeho1
客户端工具下载地址(2016-09-22):https://pan.baidu.com/s/1bpKFGrP
升级包(1.57)下载地址(2016-09-12):https://pan.baidu.com/s/1kUH0OJH
客户端工具下载地址(2016-09-07):https://pan.baidu.com/s/1i5sIyhB
客户端工具下载地址(2016-07-13):http://pan.baidu.com/s/1o8tlc9c
客户端工具下载地址(2016-07-07):http://pan.baidu.com/s/1i5O2YbV
文章完善中().....
1,单机版(多网口)支持400路以上视频流(1080及以上,4M码流)采集--已实现;
2,支持全天录像--已实现mkv支持;
3,支持硬盘滚动写入,磁盘满时自动删除最早的文件,支持磁盘配额--已实现;
4,支持磁盘阵列,支持动态扩容--已实现;
5,支持通用播放器播放储存的视频--已实现兼容vlc,portplayer;
6,支持视频rtsp分发(不限客户端数量,瓶颈在网络)--已实现;
7,rtsp使用kcp不公平协议抢占网络资源(在网络丢包,如无线网,可比tcp延时小50%以上)--已实现(同时支持tcp和udp);
8,支持视频hls分发(不限客户端数量,瓶颈在网络,pc上的vlc,android上moboPlayer实测与海康网页直播延时1S)--已实现,测试中;
9,支持视频文件rtsp点播--已实现;
10,支持按时间rtsp点播视频(既视频回放,回放与实时视频相比最小延时约为2S,保证10S)--已实现;
11,支持接收第三方程序发送的xml或json,并根据内容合成视频(延时约1S,保证5S)--已实现;
12,支持远程配置系统--已实现;
13,支持接受xml或json导入配置,方便第三方公司控制系统--已实现;
14,支持ftp浏览和下载视频--已实现;
15,支持客户端控制点播速度(可实现快速,慢速和单步播放)--已实现;
16,支持通过gb28181平台预览视频,控制球机(现只支持海康球机)--已实现;
17,支持拉取第三方gb28181平台的视频数据进行储存+rtsp转发+rtsp回放+hls转发+gb28181再推送 --已实现;
18,支持"支持gb28181的相机"直接推送视频数据到服务器进行储存+rtsp转发+rtsp回放+hls转发+gb28181再推送,同时支持NAT穿透 --已实现;
19,支持第三方使用GB28181协议访问本服务器的储存视频,同时支持第三方使用GB28181协议访问与本服务器属于同一集群的服务器上的储存视频--已实现;
20,支持接入onvif相机,代理相机控制指令,实现集中控制;
21,支持阿里云oss储存回放;
22,支持分布式集群(各台主机相互独立,互不依赖,对客户端来说集群内的任何一个节点都是中心服务器,访问任何一台主机都能获取到集群内其它主机上的数据)--已实现;
23,鉴于22条的特性,程序具有中心服务器热备,负载均衡等功能--已实现;
24,加入以telnet方式运行程序,同时配合看门狗,保证系统稳定持续运行,参考文章:http://blog.csdn.net/zhangrui_fslib_org/article/details/51591129;
1,程序采用C语言,支持arm,x86平台,具有跨平台特性;
2,程序经历了三次重构,拥有先进的框架和良好的扩展性;
1),首次编写使用传统的c面向资源对象设计(如一个相机一个对象,增加相机就增加一个类的实例),导致在通道过多时,会新建大量的对象,日志的数据量成倍增长,在处理大并发时系统将创建大量的线程,线各程的创建和消亡占用了过多的cpu,基于这些原因,在功能全开时程序只能做到100路以内的并发;
2),第一次重构加入了线程池的机制,同时程序也去掉了第三方库(不再需要live555,ffmpeg等第三方库),依然使用面向资源对象设计,这个版本虽做了大量的修改,代码量极度减少,cpu占用降低,但并发数增加仍不明显;
3),第二次重构改变了程序的设计风格,改用使用面向过程的设计模式(或面向过程对象的设计模式,一个过程一个对象,因系统内任何一个资源只经过一个过程一次,即完成整个任务所需要的过程数就是系统总的线程数,这让系统的线程数不再与通道相关,成为一个定值),解决了线程过多的问题,同时也省去了复杂的线程池,让系统变得高效简单,让系统并发数突破1000;
4),第三次重构是对第二次重构的优化,也是真正工程化的实现,在第二次重构后,虽然并发数大大增加,但大并发时的一些不可预见性问题因程序不能追踪(因路数太多,用记录日志的办法效率低下,几乎是因量太大无法分析),系统bug的修复变得困难,这次重够加入了系统异常自动记录功能,在出现异常时,可自动定位并记录异常出现在源码的什么文件的多少行,同时还可记录出现问题时对应线程你关心的内存的值,大大加简化了系统bug定位和修复,让直接处理生产环境中的异常变为了可能,同时还增加了线程资源实时消耗的统计信息,能实时了解系统中各线程的cpu占用情况;这次重够还去掉了glib的依赖,系统不再使用链表,使用数组代替链表,修改所有的查找排序的算法为二分查找,让单系统达到万级并发成为了可能;
3,系统不使用数据库,单进程,不依赖第三方库,简单可靠;
4,系统同时支持xml和json通信,让第三方集成变得异常简单;
5,程序使用配置导入导出方式进行修改程序,让程序可以向下并向后兼容,彻底解决版本不兼容给使用者带来的问题;
1,系统环境
系统托管给http://blog.csdn.net/zhangrui_fslib_org/article/details/49824353描述的系统,由此系统实现系统的更新与维护;
2,系统密码设计
小雉系统是基于linux开发,为保证系统安全,同时方便运维操作,系统密码按如下设计:
使用固定的本地密码:使用本地键盘输入本地root密码可登录系统,方便安装和本地维护;
动态的远程密码:使用ssh或telnel远程连接系统时,连接终端上会打印提示信息,操作员需根据提示信息向”小雉系统”官方用户中心获取对应的登录密码后登录系统;
注:动态密码中的提示信息随机产生,且获取的密码只能尝试一次,如输入错误,需要重新获取提示信息,使用新的密码再次尝试.
3,调试与稳定性框架设计
系统调试统一使用标准的printf打印,为使系统在实际生产过程中能远程查看到程序的实时打印信息,系统采用管道设计,保证在运行过程中能随时远程查看程序的实时和历史打印信息(调用此接口的方法:out -v 1 /fs/bin/sos,表示用管道捕捉/fs/bin/sos的标准输出),用此接口无需修改程序源码;
为了解程序线程之间的关系和线程的cpu瓶颈,设计线程监控,使用此接口,必须使用此对象;
为了定位生产过程中出现的bug,设计系统遗产处理,使用此接口,必须使用此对象,并用线程监控对象配合;
图1--远程查看打印信息(运行debug);
上图可看出可查看三个程序--fsServer(进程号369),php-fpm(进程号399,php的主程序),sos(进程号588,流媒体主程序)的打印信息;
上图可看出系统现接入16路视频
图2--远程查看程序的线程信息(运行debub -m)
上图可看出有两个程序使用了监控接口--fsServer(进程号369),sos(进程号588,流媒体主程序)的打印信息;
图3--为sos的精简版线程信息(掩码0xF6)
从上图可看出流媒体的线程组成,总共11个线程,实现了线程监控的线程有11个,能清晰地看到各个线程之间的父子关系(主线程创建了ConfigManager线程和vsys,这两个线程又创建了其他子线程),并能清晰看到各个线程的实时cpu(用户态,系统态)的占有率;
图4--程序异常的记录信息
从上图可以看到程序支持在程序死机时自己自动记录当前的线程创建顺序及时间,各线程占用的cpu,异常出现在某线程的某函数(属于某源码文件)内的某行,异常出现线程的函数调用堆栈等信息,保证程序的稳定性;
4,流媒体主程序框架
(1).主线程:负责开启各个工作线程,回收并准备数据帧传给采集线程;
(2).采集线程:负责调用各个相机的相关函数,得到视频数据初始化数据帧,把数据帧传给解码线程;
(3).解码线程:解码数据帧,得到裸数据,把数据帧传给编码线程(因现有相机的输入视频帧已是h264,最后也只是需要h264帧,此设计预留);
(4).编码线程:把数据帧编码为h264数据,把数据帧传给录像线程(因现有相机的输入视频帧已是h264,故在第一阶段时此线程为空,此设计预留);
(5).录像线程:把视频按要求保存到硬盘,把数据帧传给rtsp服务线程,响应录像合成命令;
(6).rtsp服务线程:在有需求时把视频帧进行rtp封包发送,并响应视频点播请求,把视频帧传给主线程回收;
(7).配置线程:管理系统的配置,响应客户或第三方的除视频流外的各种请求(如配置获取,配置上传,视频合成请求);
1,采集线程:现只支持h264的rtsp数据,根据vlc,potplayer数据开发,已测试海康,大华部分相机;
2,rtsp服务线程:现只支持h264流化,根据vlc和live555开发,已测试兼容vlc,potplayer;
3,录像线程:现支持把实时数据保存到mkv文件,能响应视频合成请求合成mkv视频,精度在一帧;
4,配置线程:现支持远程导入和导出配置,支持权限管理,数据自描述校验;
假设条件
1,任何设备或资源(如相机,雷达,gps)都有唯一编号,即唯一的uuid;
2,任何设备或资源(如相机,雷达,gps)处理可由单核完成;
3,任何设备或资源(如相机,雷达,gps)的系统配置的数据传输占用的带宽远远小于设备传递的信息量;
系统实现原理
1,配置同步
1),把要接入的设备信息写入一个文件,每条信息都有自己对应的组号(组号对应集群节点的IP);
2),把配置文件发送给集群的任何一个节点(假设为节点A);
3),节点A检查导入配置文件到内存,并计算新配置的校验和,如果校验和没有改变,就不执行以后的动作;
4),节点A获取配置文件内各组的配置校验和,向与自己校验和不相同的节点发送新的配置文件;
注:每个节点只处理属于自己组的资源,如只对属于自己组的相机设备进行录像和转发;
2,请求处理
1),所有请求的发起者都必须包含欲请求资源的uuid,客户端可向集群内的任何一个节点发起请求,如请求节点A;
2),节点A查找请求资源,如果此资源是自己处理的,就直接处理并返回,如果是其它节点处理的返回目的重定向地址(如果有多个目的地址,
就轮询选择一个,以此实现负载均衡);
注:建议客户端建立一个缓存,缓存各个资源所在主机的ip,可提高系统的响应速度;
建议客户端保存多个集群节点的IP,这样可实现冗余;
此设计的优势
1,支持单机版,系统配置可做到向下兼容,降低老项目的维护成本;
2,无须添加硬件,节约硬件成本;
3,集群内节点无从属关系,部署简单;
4,集群内任何节点都可以做中心服务器,增加节点数量不仅可增加集群的负载能力,同时也可增加中心服务器冗余度;
5,集群内节点无直接关系,一个节点能否正常工作完全由本机决定,独立性好;
6,此设计同时支持单机版和集群,支持第三方用其它方案实现系统集群;
此设计的缺陷
1,配置同步所需要的数据量是N*N,即节点数量的平方,在节点过多时会产生广播风暴;
限制条件(产生的原因:系统采用分布式集群设计,系统内部所有命令用"命令字+uuid+主机ip"进行唯一区分)
1,因命令字由开发者决定,故同一主机内不得存在uuid相同的相机或资源(相同uuid的设备执行是随机的,但不会死机,删除重复的异常通道可自动恢复);
2,不同主机之间如果有相同uuid的资源可实现负载均衡,但负载量由工程人员决定,系统不会自动调整;
3,不同主机之间的不同uuid的资源组成集群,但节点的负载量由工程人员决定,系统不会自动调整;
-bash-4.2# configcore -h
-h:for help.
-c:set input config data,remote host or local file,eg(default). -c 127.0.0.1:16863.
-i:import data,must after -c,could use multi times.
-o:set output config data,remote host or local file.
-t:set local output file type(0--config,1--ebml with comment,2--ebml,3--xml all,4--xml with comment,5--xml,6--json all,7-json),eg(default). -t 0.
-q:set quit after run program.
(1)xml完整方式导出配置(configcore -c 127.0.0.1 -o /fs/project/data/1.txt -t 3)
太多了,省略
(2)xml只代注释方式导出配置(configcore -c 127.0.0.1 -o /fs/project/data/1.txt -t 4)
(3)json不带注释方式导出配置(configcore -c 127.0.0.1 -o /fs/project/data/1.txt -t 7)
{
"vsys":{
"ntpfreq":"6",
"ntpserver":"192.168.50.188",
"vsysChannel":[{
"uuid":"2",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"192.168.50.252",
"rtspPort":"554",
"rtspURL":"/h264/ch2/main/av_stream",
"rstpUsername":"admin",
"rstpPasswd":"12345"
},
"recordConfig":{
"rtspServerURL":"/ch1"
}
},{
"uuid":"57",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"192.168.50.251",
"rtspPort":"554",
"rtspURL":"/defaultPrimary?streamType=u",
"rstpUsername":"admin",
"rstpPasswd":"12345"
},
"recordConfig":{
"rtspServerURL":"/57"
}
},{
"uuid":"6",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"192.168.50.64",
"rtspPort":"554",
"rtspURL":"/h264/ch2/main/av_stream",
"rstpUsername":"admin",
"rstpPasswd":"12345abc"
},
"recordConfig":{
"rtspServerURL":"/6"
}
},{
"uuid":"4",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"192.168.50.65",
"rtspPort":"554",
"rtspURL":"/h264/ch2/main/av_stream",
"rstpUsername":"admin",
"rstpPasswd":"12345abc"
},
"recordConfig":{
"rtspServerURL":"/4"
}
},{
"uuid":"66",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"192.168.50.66",
"rtspPort":"554",
"rtspURL":"/h264/ch2/main/av_stream",
"rstpUsername":"admin",
"rstpPasswd":"12345abc"
},
"recordConfig":{
"rtspServerURL":"/66"
}
},{
"uuid":"67",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"192.168.50.67",
"rtspPort":"554",
"rtspURL":"/h264/ch2/main/av_stream",
"rstpUsername":"admin",
"rstpPasswd":"12345abc"
},
"recordConfig":{
"rtspServerURL":"/67"
}
},{
"uuid":"tt001",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"127.0.0.1",
"rtspPort":"554",
"rtspURL":"/ch1"
},
"recordConfig":{
"rtspServerURL":"/tt001"
}
},{
"uuid":"tt002",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"127.0.0.1",
"rtspPort":"554",
"rtspURL":"/ch1"
},
"recordConfig":{
"rtspServerURL":"/tt002"
}
},{
"uuid":"tt003",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"127.0.0.1",
"rtspPort":"554",
"rtspURL":"/ch1"
},
"recordConfig":{
"rtspServerURL":"/tt003"
}
},{
"uuid":"tt004",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"127.0.0.1",
"rtspPort":"554",
"rtspURL":"/ch1"
},
"recordConfig":{
"rtspServerURL":"/tt004"
}
},{
"uuid":"tt005",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"127.0.0.1",
"rtspPort":"554",
"rtspURL":"/ch1"
},
"recordConfig":{
"rtspServerURL":"/tt005"
}
},{
"uuid":"tt006",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"127.0.0.1",
"rtspPort":"554",
"rtspURL":"/ch1"
},
"recordConfig":{
"rtspServerURL":"/tt006"
}
},{
"uuid":"tt007",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"127.0.0.1",
"rtspPort":"554",
"rtspURL":"/ch1"
},
"recordConfig":{
"rtspServerURL":"/tt007"
}
},{
"uuid":"tt008",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"127.0.0.1",
"rtspPort":"554",
"rtspURL":"/ch1"
},
"recordConfig":{
"rtspServerURL":"/tt008"
}
},{
"uuid":"tt009",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"127.0.0.1",
"rtspPort":"554",
"rtspURL":"/ch1"
},
"recordConfig":{
"rtspServerURL":"/tt009"
}
},{
"uuid":"tt010",
"cameraConfig":{
"cameraType":"rtsp",
"ipv4":"127.0.0.1",
"rtspPort":"554",
"rtspURL":"/ch1"
},
"recordConfig":{
"rtspServerURL":"/tt010"
}
}]
}
}
配置使用导入导出方式,支持标准的xml和json,方便第三方作二次开发
streamtype:
0--正序正常播放,1-倒序正常播放,2-正序关键帧播放,3-倒序关键帧播放
硬件环境: 内存 :2G CPU:AMD X4 955 主频:3.4GHz 4核4线程 流媒体接千兆口,其他接百兆口,320G硬盘一块,1T硬盘两块
IO峰值:60M/s
句柄:799
线程数:11
CPU稳定在26%-45%
内存峰值:550M
硬盘IO均值:32.1M/s
网络下行:289m/s
网络上行:69m/s
硬件环境: 内存 :4G CPU:AMD X4 955 主频:3.4GHz 4核4线程 双千intel千兆口输入, 一rtl8169输出,6块7200rpm高性能监控硬盘(每个1T)组rad0软阵列;
测试条件:400路1080P视频(4M码流)同时采集并录像,23台pc同时直播流媒体转发视频(共110路)
硬盘IO峰值:250M/s
句柄:2673
线程数:25
CPU稳定在65%-87%
内存峰值:1.2G
硬盘IO均值:198M/s
网卡1(intel)下行(采集):768m/s
网卡2(intel)下行(采集):789m/s
网卡3(rtl8169)上行(转发):431m/s
九,使用文档
1,系统安装
2,网络设置
3,硬盘设置
4,系统更新
5,配置工具