分类 原创教程 下的文章

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/58/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


概述

      视频储存分为ipc前端储存和后端集中储存,随着网络技术的发展,在具备网络条件的应用场景中应当使用集中储存,主要理由如下:

  1. 硬盘属于消耗品,在视频储存应用中长期读写,寿命短,集中储存可以节约去现场的人工成本;
  2. 已有网络的应用环境并不能因前端储存就不用部署网路或不用维护网路,前端储存只会增加运维成本;
  3. 集中储存一台服务器接多路相机,需要挂载多硬盘,集中储存服务器可以使用raid5,而前端储存冗余只能使用raid1,raid5比raid1更省磁盘空间;

      集中储存虽具备节约运维成本的优势,但因储存集中化,储存设备故障、服务器故障、软件bug等问题导致数据丢失的问题相较前端ipc储存更加严重,小雉视频系统针对这一缺陷提出了一份低成本的冗余方案--小雉视频共享储存;


小雉视频共享储存

      为避免单点故障,采用冗余方案是行业的通用做法,但视频属于大数据,提供多份磁盘储存冗余将显著增加项目建设成本,降低企业利润,小雉视频共享储存方案是在仅有一份磁盘储存的条件下实现服务器故障(硬件故障、软件bug)、磁盘储存故障(短暂掉电、重启、短暂断网、软件bug升级)视频数据不丢失,持续安全储存的低成本方案,其拓扑图如下:
小雉视频共享储存

  • 相机同时接入“小雉视频系统1”、“小雉视频系统2”、“小雉视频系统N”;
  • 每台小雉视频系统配一块专用储存,一块固态可达1000M读写性能,即一台服务器配一块固态硬盘即可;

固态硬盘价格

  • 系统启动后均使用专用储存进行储存;
  • “小雉视频系统1”、“小雉视频系统2”、“小雉视频系统N”使用“比特币”去中心化原理进行选举,获得选举权的主机挂载“共享磁盘阵列”,挂载成功后(如“小雉视频系统1”获得选举权)切换相机使用“共享磁盘阵列”进行视频储存,并合并“本机专用储存数据”到“共享磁盘阵列”;
  • 未获得选举权的主机(“小雉视频系统2”、“小雉视频系统N”)在收到客户端的视频请求时应自动重定向到获得选举权的主机(如“小雉视频系统1”);
  • 未获得选举权的主机(“小雉视频系统2”、“小雉视频系统N”)需要监控获得选举权的主机(如“小雉视频系统1”)的运行情况,如获得选举权的主机出现异常(包括软件bug、硬件故障、与共享磁盘阵列间连接故障、共享磁盘阵列故障),未获得选举权的主机(“小雉视频系统2”、“小雉视频系统N”)再次进行选举,获得选举权的主机(如“小雉视频系统2”)挂载“共享磁盘阵列”,挂载成功后切换相机使用“共享磁盘阵列”进行视频储存;
    -之前出现异常的主机(如“小雉视频系统1”)恢复后使用本地专用磁盘进行录像储存,加入未获得选举权的主机阵营,监控当前获得选举权的主机(如“小雉视频系统2”)的运行情况;

小雉视频共享储存性能指标

  1. 发现故障切换耗时--30S至120S,即出现故障后的120S时间内无法访问完整的录像视频,此段时间访问的视频是本地专用磁盘上的数据;
  2. 帧对齐--完美对齐,不多一帧也不少一帧,在发生切换时需要把“本地专用储存”上的视频合并到“共享磁盘阵列上”使用AI检测,即对图像内容进行检测,计算出精确的边界,不受时间精度的影响(通用的补录方案是使用时间戳比对),保证视频拼接完美;

方案对比

特性小雉视频共享储存ipc补录方案磁盘冗余方案主从同步方案(定时器)
运维成本低(无需前端运维)高(需要前端运维)低(无需前端运维)低(无需前端运维)
磁盘成本低(一份磁盘+每机专用储存)较低(一份磁盘+每IPC SD卡)高(多份磁盘)低(一份磁盘+每机专用储存)
响应时间低(30-120S)较低(数分钟)非常低(无须切换合并)高(数小时)
合并成本低(仅在切换时发生)较低(合并数据比较多)非常低(无须合并)高(需要在大范围内检索)
合并效果完美(AI合并,完美帧对齐)存在缺失(一般采用时间戳对比,不多数据就少数据,因h264、h265需要关键帧解码问题,大部分时间会丢2S左右数据)完美(无须合并)存在缺失(一般采用时间戳对比,不多数据就少数据,因h264、h265需要关键帧解码问题,大部分时间会丢2S左右数据)

      综上,“小雉视频共享储存”是一种成本低效果好的均衡方案。

猜您可能喜欢
小雉系统安装: http://www.feitianzhi.com/boke/index.php/archives/11/
小雉系统安装包制作: http://www.feitianzhi.com/boke/index.php/archives/50/
小雉系统网络配置:http://www.feitianzhi.com/boke/index.php/archives/15/
小雉系统硬盘配置:http://www.feitianzhi.com/boke/index.php/archives/16/
小雉系统远程升级:http://www.feitianzhi.com/boke/index.php/archives/14/
使用Google Authenticator为小雉系统增加动态密码功能:http://www.feitianzhi.com/boke/index.php/archives/17/
小雉配置工具:http://www.feitianzhi.com/boke/index.php/fslib-config.html
资源下载:http://www.feitianzhi.com/boke/index.php/ziyuanxiazai.html

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/58/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


概述

      小雉系统可从线上系统制作安装包到U盘,制作的安装包可用于新系统的安装;
      小雉系统只提供升级包,对应的安装包均是客户在应用升级包后按本文或http://www.feitianzhi.com/boke/index.php/archives/50/自行制作;


步骤

  1. http://www.feitianzhi.com/boke/index.php/archives/14/ 把系统升级到期望的版本;
  2. 准备一个剩余空间4G的u盘,需要格式化为fat32;
  3. 在U盘根目录创建一个名为"getimg"的空文件;
  4. 把U盘插入线上系统;
  5. 等待系统发出"嘟"的声音后拔出U盘,u盘的内容如下图所示

小雉系统U盘安装包制作

  1. http://www.feitianzhi.com/boke/index.php/archives/11/云服务器安装章节安装系统;

猜您可能喜欢
小雉系统安装: http://www.feitianzhi.com/boke/index.php/archives/11/
小雉系统U盘安装包制作: http://www.feitianzhi.com/boke/index.php/archives/57/
小雉系统安装包制作: http://www.feitianzhi.com/boke/index.php/archives/50/
小雉系统网络配置:http://www.feitianzhi.com/boke/index.php/archives/15/
小雉系统硬盘配置:http://www.feitianzhi.com/boke/index.php/archives/16/
小雉系统远程升级:http://www.feitianzhi.com/boke/index.php/archives/14/
使用Google Authenticator为小雉系统增加动态密码功能:http://www.feitianzhi.com/boke/index.php/archives/17/
小雉配置工具:http://www.feitianzhi.com/boke/index.php/fslib-config.html
资源下载:http://www.feitianzhi.com/boke/index.php/ziyuanxiazai.html

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/55/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


背景

      之前一直使用腾讯企业邮箱,最近腾讯强制绑定微信、手机验证让人不爽;


方案

      本方案是基于centos8.1进行定制,增加邮件相关的组件(大概18M),实现基础的邮件收发功能;
小雉系统邮件服务器
      本文演示以vultr的vps为例搭建邮件服务器;


步骤

  1. 系统安装,配置网络,配置硬盘,参考http://www.feitianzhi.com/boke/index.php/archives/11/ 进行安装;
  2. 升级,在http://www.feitianzhi.com/boke/index.php/ziyuanxiazai.html 选择 4.181.1507 以后的版本参考http://www.feitianzhi.com/boke/index.php/archives/14/ 进行升级;
  3. 使用ftp把https://download.csdn.net/download/zhangrui_fslib_org/87637156的mysql初始数据库上传到ftp://admin:12345@ip的根目录,如果存在权限问题,可以ssh登录(root/12345)后chmod 777 /fs/project/data(ftp的根目录);
  4. ssh登录(root/12345)主机,执行

    cd /fs/project/data;
    gzip -cd mysql-mail.cpio.gz|cpio -idvm;
    sync;
    reboot;

  5. 使用浏览器访问http://ip/mailadmin/index.php 管理域名服务器(admin/admin123),包括添加域名,添加邮箱;
  6. 使用浏览器访问http://ip/maila/index.php 登录邮箱,进行邮件收发(账户密码为第5步添加的用户名密码);

猜您可能喜欢
小雉系统安装: http://www.feitianzhi.com/boke/index.php/archives/11/
小雉系统安装包制作: http://www.feitianzhi.com/boke/index.php/archives/50/
小雉系统网络配置:http://www.feitianzhi.com/boke/index.php/archives/15/
小雉系统硬盘配置:http://www.feitianzhi.com/boke/index.php/archives/16/
小雉系统远程升级:http://www.feitianzhi.com/boke/index.php/archives/14/
使用Google Authenticator为小雉系统增加动态密码功能:http://www.feitianzhi.com/boke/index.php/archives/17/
小雉配置工具:http://www.feitianzhi.com/boke/index.php/fslib-config.html
资源下载:http://www.feitianzhi.com/boke/index.php/ziyuanxiazai.html

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/50/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


概述

      小雉系统的安装包可从线上系统中直接制作,制作的安装包包含线上系统的更新;
      小雉系统只提供升级包,对应的安装包均是客户在应用升级包后按本文自行制作;


步骤

  1. root登录ssh系统;
  2. 运行“cd /fs/project/data”;
  3. 运行“/fs/bin/ddimg”;
  4. 使用gzip压缩;
  5. 使用ftp下载安装包;

小雉系统安装包制作

猜您可能喜欢
小雉系统安装: http://www.feitianzhi.com/boke/index.php/archives/11/
小雉系统安装包制作: http://www.feitianzhi.com/boke/index.php/archives/50/
小雉系统网络配置:http://www.feitianzhi.com/boke/index.php/archives/15/
小雉系统硬盘配置:http://www.feitianzhi.com/boke/index.php/archives/16/
小雉系统远程升级:http://www.feitianzhi.com/boke/index.php/archives/14/
使用Google Authenticator为小雉系统增加动态密码功能:http://www.feitianzhi.com/boke/index.php/archives/17/
小雉配置工具:http://www.feitianzhi.com/boke/index.php/fslib-config.html
资源下载:http://www.feitianzhi.com/boke/index.php/ziyuanxiazai.html

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/47/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


概述

      软件的开发离不开配置,传统的软件设计包括前端、后台和数据库3部分,三者是密切配合的统一整体,在实际项目中往往遇到以下问题:

  1. 因项目需求不明而增加、修改、删除参数导致配置结构调整后难以同已有数据兼容;
  2. 后台参数修改后,前端需要同步修改,无法做到老版本前端与新版本后台配合(新版本后台可能修正了bug,老版本前端属于老项目),修正老项目bug需要在老版本分支上进行,代码分支多,维护困难;
  3. 配置备份困难。首先后台与数据库之间有多个访问渠道,配置备份需要停机备份;其次备份的配置无法线上热还原(有差异部分相关模块重置,无修改部分持续工作,如仅1相机参数有区别,仅停掉1相机进行重连,其余相机持续工作);最后备份的配置无法在新版本或老版本上进行还原(因为字段结构不一样);
  4. 授权困难,配置臃肿。为实现所有用户需求,软件的参数量非常庞大,而对一个具体项目可能只需要其中的很少只关联10个参数的功能,把大量的参数置于系统中会拖慢系统(一个表只有1列可以允许插入1亿行,但如有1000列,可能表就只能插入10万行了)同时软件中需要通过授权判断而限制用户在授权范围内操作,系统调试困难--授权是在做一个减法操作;

思考与假设

      “小雉视频系统”是一套集所有客户需求于一体的一套视频软件,参数的修改随客户的要求变化而变化,均为不可预知的参数需求,为每位客户单独开一个分支会增加bug修正的同步成本和升级包制作成本,“小雉视频系统”迫切需要一套廉价的高效率的配置设计方案,要求方案具备如下特性:

  1. 配置项在各个模块中申明(限制值的类型、范围、个数和有效条件(比如A参数必须要B参数为1时才有效可设置)),在模块中读取,把参数的管理放到各个模块中,各个模块只需要根据本模块的需要申明参数,实现参数的模块化(移除此模块也移除了此模块的参数);
  2. 各个模块申明配置项时如同全新开发一样申明参数即可,同历史参数的兼容归配置模块算法实现;
  3. 各个模块如果未被授权,则不申明参数,通过减少参数增加系统的容量及并发,既功能少,并发高,让授权是一个加法操作;
  4. 申明参数时指定默认值,在客户端传参时未有对应参数时读取此参数时读到的值为默认值,以此实现对历史客户端的兼容(历史客户端与新版本后台字段有差异部分使用默认值代替,保证新后台可同老客户端适配);
  5. 申明参数时同时申明中文名、注释、可选值,即把注释写入配置,在配置导出时可自动对参数注释,实现文档源码化;
  6. 配置可以热导出,导出后的配置可热导入到任意版本的后台,配置模块可自动探测到变化,自动完成对象实例的增删改动作;
  7. 配置可以导出xml,json等格式,并支持xml,json的导入;
  8. 配置可导出非默认值部分字段,也能导入,实现瘦客户端编程(服务器可以集所有功能与一体,但针对具体的项目客户,可能只需要部分功能,可在完整客户端上正确配置对应项目需求的功能参数后导出参数,瘦客户端上只针对导出参数进行开发,减少参数可提高客户端的人性化程度);

小雉配置解决方案

      基于假设“小雉配置”采用面向属性的配置设计方式,把配置项分为节点型、模板、字符串、整型、浮点和二进制共6种数据类型,每种数据类型可设置多个条件组,以条件组内的所有条件为真此条件组为真,任何一个条件组为真则参数有效;
      “小雉配置”采用C语言编写,可用于windows,linux,arm等平台,配置为单文件,本地可拷贝备份,远程可热导入导出xml和json,配置可承载数千参数(结构可类似xml任意层级嵌套)数十万级别的量(类比一张表有上千列,表可以容纳数十万行);


小雉配置数据类型

  1. 节点型类型
          类似于xml中的a->b->c,其中b节点包含c,则b为节点型类型,且a下面有且只能有一个b;节点型类型可以作为节点型节点和模板节点的子类型,可以设置中文名、注释、条件判断,不能设置默认值,可选值;
    fs_Config_node_node_add //添加节点型参数
    fs_Config_node_get_first //获取节点型参数
  2. 模板类型
          类似于xml中的a->b->c,其中b节点包含c,如b固定且只有一个则b为节点型类型,如b可以是0到多个,则b为模板类型,申明模板实质是申明一个类,配置时在a下创建此类的多个实例(创建多少个实例,a下有多少个b,b的子节点与类的结构完全相同);模板类型主要用于同类型数据的管理(比如添加相机);模板类型可以作为节点型节点和模板节点的子类型,可以设置中文名、注释、条件判断、可创建实例的个数、时间控制参数(比如有两个模板实例,第一个模板实例在0-7点生效,另外一个在7-24时生效,实现参数随时间变化的控制),不能设置默认值,可选值;
    fs_Config_node_template_add //添加节点型参数
    fs_Config_node_template__IO //获取节点型参数
  3. 字符串类型
          字符串类型是一个储存字符串数据的节点类型;字符串类型可以作为节点型节点和模板节点的子类型,可以设置中文名、注释、条件判断、可设置值的个数、字符串长度、默认值、可选值;
    fs_Config_node_string_add //添加字符串类型参数
    fs_Config_node_string_get_first //获取字符串类型参数
  4. 整型类型
          整型类型是一个储存64位有符号整数的节点类型;整型类型可以作为节点型节点和模板节点的子类型,可以设置中文名、注释、条件判断、可设置值的个数、值的范围、默认值、可选值;
    fs_Config_node_integer_add //添加整型类型参数
    fs_Config_node_integer_get_first //获取整型类型参数
  5. 浮点类型
          浮点类型是一个储存64位浮点的节点类型;浮点类型可以作为节点型节点和模板节点的子类型,可以设置中文名、注释、条件判断、可设置值的个数、值的范围、默认值、可选值;
    fs_Config_node_float_add //添加浮点类型参数
    fs_Config_node_float_get_first //获取浮点类型参数
  6. 二进制类型
          二进制类型是一个储存任意数据类型的节点类型;二进制类型可以作为节点型节点和模板节点的子类型,可以设置中文名、注释、条件判断、可设置值的个数、数据长度范围、默认值、可选值;
    fs_Config_node_binary_add //添加二进制类型参数
    fs_Config_node_binary_get_first //获取二进制类型参数

小雉配置的简单演示

int main() {
// 创建配置
FsConfig * const pConfig = fs_Config_new__IO();
// 创建一个节点型节点
void *const node = fs_Config_node_node_add(pConfig, pConfig, "node", "节点", "测试节点", 0, 0x7);
{
    /* 在node下创建一个字符串节点,节点可以设置2个值,长度为0到10个字节 */
    void *const testString = fs_Config_node_string_add(pConfig, node, "testString", "测试字符串", "测试字符串", 0, 0x7, 0, 10, 2);
    /* 为testString添加一个default1的默认值 */
    fs_Config_node_string_add_value(pConfig, testString, FsConfig_nodeValue_default, "default1", "默认值1", "默认值1");
    /* 为testString添加一个optiona1的可选值 */
    fs_Config_node_string_add_value(pConfig, testString, FsConfig_nodeValue_optional, "optiona1", "可选值1", "可选值1");
    /* 在node下创建一个整型节点,节点可以设置2个值,取值范围为0到666666 */
    void *const testInt = fs_Config_node_integer_add(pConfig, node, "testInt", "测试整数", "测试整数", FsConfig_nodeShowType_default, 0, 0x7, 0, 666666, 2);
    /* 为testInt添加一个0的默认值 */
    fs_Config_node_integer_add_value(pConfig, testInt, FsConfig_nodeValue_default, 0, "0", "0");
    /* 为testInt添加一个100的可选值 */
    fs_Config_node_integer_add_value(pConfig, testInt, FsConfig_nodeValue_optional, 100, "100", "100");
    /* 在node下创建一个浮点节点,节点可以设置3个值,取值范围为0.0到1.0 */
    void *const testFloat = fs_Config_node_float_add(pConfig, node, "testFloat", "测试浮点", "测试浮点", 0, 0x7, 0.0, 1.0, 3);
    /* 为testFloat添加一个0.0的默认值 */
    fs_Config_node_float_add_value(pConfig, testFloat, FsConfig_nodeValue_default, 0.0, "0.0", "0.0");
    /* 为testFloat添加一个1.0的可选值 */
    fs_Config_node_float_add_value(pConfig, testFloat, FsConfig_nodeValue_optional, 1.0, "1.0", "1.0");
    /* 在node下创建一个二进制节点,节点可以设置2个值,长度为0到100个字节 */
    void *const testBinary = fs_Config_node_binary_add(pConfig, node, "testBinary", "测试二进制", "测试二进制", 0, 0x7, 1, 100, 2);
    /* 为testBinary创建一个条件组 */
    void *const condition_testBinary = fs_Config_condition_group_add(pConfig, testBinary);
    /* 向condition_testBinary添加一个条件,相对于testBinary节点向上一级的父节点中查找testInt节点,在testInt的值为0时此值有效 */
    fs_Config_condition_add_static(pConfig, condition_testBinary, 1, "testInt", FsConfig_Condition_equal, "0");
}
// 创建一个可以创建100个实例的模板
void *const template = fs_Config_node_template_add(pConfig, pConfig, "testTemplate", "测试模板", NULL, NULL, "测试模板", NULL, NULL, NULL, 0, 0x7, 100);
{
    /* 在template下创建一个字符串节点,节点可以设置2个值,长度为0到10个字节 */
    void *const testString1 = fs_Config_node_string_add(pConfig, template, "testString1", "测试字符串1", "测试字符串1", 0, 0x7, 0, 10, 2);
    /* 为testString1添加一个默认值 */
    fs_Config_node_string_add_value(pConfig, testString1, FsConfig_nodeValue_default, "default1", "默认值1", "默认值1");
    /* 为testString1添加一个可选值 */
    fs_Config_node_string_add_value(pConfig, testString1, FsConfig_nodeValue_optional, "optiona1", "可选值1", "可选值1");
    /* 在template下创建一个字符串节点,节点可以设置2个值,长度为0到10个字节 */
    void *const testString2 = fs_Config_node_string_add(pConfig, template, "testString2", "测试字符串2", "测试字符串2", 0, 0x7, 0, 10, 2);
    /* 为testString2创建一个条件组 */
    void *const condition_testString2 = fs_Config_condition_group_add(pConfig, testString2);
    /* 向condition_testString2添加一个条件,相对于testString2节点向上两级的父节点中查找node节点,再在node节点中查找testInt节电,在testInt的值为0时此值有效 */
    fs_Config_condition_add_static(pConfig, condition_testString2, 2, "node testInt", FsConfig_Condition_equal, "0");
}
// 把配置保存到文件,可使用小雉配置工具打开编辑
// 项目中可把配置发送给客户端
fs_Config_save_to_file_direct(pConfig, "test.cfg");
/* 定义一个xml模拟历史数据导入 */
{
    const char *str = "<testTemplate><testString1>sss1</testString1></testTemplate>"
            "<testTemplate><testString2>ssss2</testString2></testTemplate>"
            "<node><testInt>30</testInt><testFloat>0.5</testFloat></node>";
    FsXml *pXml = fs_Xml_new_from_string__IO(str, NULL);
    fs_Xml_analyzeAll(pXml, (struct FsXml_node*) pXml, NULL);
    FsEbml *pEbml1 = fs_Ebml_new_from_Xml__IO(pXml);
    fs_Xml_delete__OI(pXml, NULL);
    fs_Config_import_onlyData((FsEbml*) pConfig, (struct FsEbml_node*) pConfig, (struct FsEbml_node*) pConfig, (FsEbml*) pEbml1, (struct FsEbml_node*) pEbml1, NULL);
    fs_Ebml_delete__OI(pEbml1, NULL);
}
// 当前pConfig已包含导入的数据,可存盘
fs_Config_save_to_file_direct(pConfig, "test1.cfg");
// 读取历史的配置文件"test1.cfg",按目前在申明导入到pConfig中
{
    FsConfig * const pConfig1 = fs_Config_new_from_file__IO("test1.cfg", NULL);
    fs_Config_import_onlyData((FsEbml*) pConfig, (struct FsEbml_node*) pConfig, (struct FsEbml_node*) pConfig, (FsEbml*) pConfig1, (struct FsEbml_node*) pConfig1, NULL);
    fs_Config_delete__OI(pConfig1, NULL);
}
/* 把pConfig导出为json */
FsObjectBase * const pObjectBase = fs_Config_export_objectBase__IO(pConfig, FsConfig_ExportType_json_export, sizeof (FsObjectBase), 0, NULL);
printf("%s\n", pObjectBase->data);
/* 打印数据为:
 * {
 *     "node":{
 *         "testString":"default1",
 *         "testInt":"30",
 *         "testFloat":"0.500000",
 *         "testBinary":""
 *     },
 *     "testTemplate":[{
 *         "testString1":"sss1",
 *         "testString2":""
 *     },{
 *         "testString1":"default1",
 *         "testString2":"ssss2"
 *     }]
 * }
 */
/* 读取node testInt的值,打印结果为testInt=30 */
printf("testInt=%lld\n", fs_Config_node_integer_get_first(pConfig, pConfig, pConfig, "node testInt", 0, NULL));
/* 读取node testFloat的值,打印结果为testFloat=0.500000 */
printf("testFloat=%lf\n", fs_Config_node_float_get_first(pConfig, pConfig, pConfig, "node testFloat", 0, NULL));
pObjectBase->_delete(pObjectBase);
fs_Config_delete__OI(pConfig, NULL);
return 0;
}

      源码下载地址
      github:https://github.com/feitianzhi/fslib-config
      gitee:https://gitee.com/feitianzhi/fslib-config
      配置工具demo: http://www.feitianzhi.com/boke/index.php/fslib-config.html

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/44/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


概述

      本文描述的内容归属于"小雉视频NVR子系统"的功能描述;

背景

      一项目在您入场时可能已存在很多历史的安防储存设备,要把已有储存设备上的视频接入自己的客户端可能需要对很多开发量,同时如需要在移动端播放这些回放视频更是存在一定的技术壁垒;
      本文介绍使用"小雉视频NVR子系统"配置gb28181接入第三方的直播及回放视频,"小雉视频NVR子系统"负责把接入的回放视频转rtsp,hls,gb28181协议输出,同时"小雉视频NVR子系统"会把访问过的视频进行缓存,让新的客户端不再从前端储存中获取(如两个rtsp,两个hls,两个gb28181客户端取同一路流的相近时间的回放视频,"小雉视频NVR子系统"只向前端储存设备取一次流);

配置

小雉视频NVR子系统

  • 在海康nvr中配置使用gb28181接入到"小雉视频NVR子系统",如下图;

小雉视频NVR子系统

  • vlc效果展示(上图为gb28181回放转hls,下图为gb28181回放转rtsp),如下图;

小雉视频NVR子系统

小雉视频NVR子系统

猜您可能喜欢

小雉系统安装:http://www.feitianzhi.com/boke/index.php/archives/11/
小雉系统网络配置:http://www.feitianzhi.com/boke/index.php/archives/15/
小雉系统硬盘配置:http://www.feitianzhi.com/boke/index.php/archives/16/
小雉系统远程升级:http://www.feitianzhi.com/boke/index.php/archives/14/
使用Google Authenticator为小雉系统增加动态密码功能:http://www.feitianzhi.com/boke/index.php/archives/17/
GB28181 级联 CDN 回放:http://www.feitianzhi.com/boke/index.php/archives/37/
小雉视频系统负载均衡之GB28181多线负载均衡:http://www.feitianzhi.com/boke/index.php/archives/28/
小雉视频系统GB28181-2016配置:http://www.feitianzhi.com/boke/index.php/archives/41/

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/41/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


      小雉视频系统从3.165.3509版本开始支持GB28181-2016版本,SIP指令及视频流均同时支持tcp和udp;

GB28181端口配置

  • 1路具体的gb28181视频配置(储存,rtsp,rtmp,hls,gb28181转发)

1路具体的gb28181视频配置(储存,rtsp,rtmp,hls,gb28181转发)

猜您可能喜欢

小雉系统安装:http://www.feitianzhi.com/boke/index.php/archives/11/
小雉系统网络配置:http://www.feitianzhi.com/boke/index.php/archives/15/
小雉系统硬盘配置:http://www.feitianzhi.com/boke/index.php/archives/16/
小雉系统远程升级:http://www.feitianzhi.com/boke/index.php/archives/14/
使用Google Authenticator为小雉系统增加动态密码功能:http://www.feitianzhi.com/boke/index.php/archives/17/
GB28181 级联 CDN 回放:http://www.feitianzhi.com/boke/index.php/archives/37/
小雉视频系统负载均衡之GB28181多线负载均衡:http://www.feitianzhi.com/boke/index.php/archives/28/

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/37/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


GB28181级联

流媒体服务器-CDN级联
      "GB28181一般级联"实质是多个sip服务器的级联,转发sip指令到视频源中的sip服务器执行,各级中的流媒体负责转发视频流;
      "GB28181 CDN 级联"在各级增加了CDN服务器,对回放视频流进行缓存,在视频回放时,优先判断本级的cdn服务器是否有对应时间视频,有视频则直接使用本级cdn缓存数据,不向下级请求流,cdn无对应时间视频,则向下级请求视频转发并进行缓存;

小雉级联回放

      小雉系统采用"GB28181 CDN 级联"技术方案实现,同时增加了多种转码服务器,以满足不同设备的需要;

  1. RTSP转码
          RTSP转码器与sip服务器和cdn服务器对接,实现gb28181直播流转rtsp直播流,支持使用rtsp进行视频回放,可用于安防客户端开发;
  2. RTMP转码
          RTMP转码器与sip服务器和cdn服务器对接,实现gb28181直播流转rtmp直播流,支持使用rtmp进行视频回放,可用于老系统web视频直播与回放;
  3. HLS转码
          HLS转码器与sip服务器和cdn服务器对接,实现gb28181直播流转hls直播流,支持使用hls进行视频回放,可用于android,iphone,ipad,qq,微信等H5的直播回放;

猜您可能喜欢

小雉系统安装:http://www.feitianzhi.com/boke/index.php/archives/11/
小雉系统网络配置:http://www.feitianzhi.com/boke/index.php/archives/15/
小雉系统硬盘配置:http://www.feitianzhi.com/boke/index.php/archives/16/
小雉系统远程升级:http://www.feitianzhi.com/boke/index.php/archives/14/
使用Google Authenticator为小雉系统增加动态密码功能:http://www.feitianzhi.com/boke/index.php/archives/17/

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/35/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


介绍

      一般视频系统由流媒体服务器和信令服务器组成,信令服务器一般负责客户端请求(如客户端要看a视频需要先通知信令服务器分配合适的流媒体去准备a的流,之后客户端才能通过流媒体看a的流)和控制流媒体服务器;本文所述的“去中心管理”就是去掉信令服务器;


中心管理的缺陷

  1. 调试不方便

在对标准流媒体协议进行调试时,如可使用vlc调试rtsp流,但vlc无法同信令服务器通信,使得调试麻烦;

  1. 级联难度高

各级可能使用不同的流协议,如rtsp同rtmp可认为有一定的相似度,但rtsp同gb28181的相似度几乎为0,两种不同协议的信令服务器对接难度非常高;

  1. 不能满足项目定制的需求

信令服务器往往同流媒体相关,在流媒体开发时已对信令服务器提出多项要求,导致信令服务器的一些特性与实际项目相悖;


小雉视频系统之去中心管理

      再合理的设计也是规则,也是束缚,小雉视频系统直接去掉了信令服务器,把信令服务器成为一张白纸,任君在项目中随意书写,以下为小雉视频系统不同协议级联的体验说明
小雉视频系统-级联

  1. 从相机直接拉取rtsp到“小雉视频1_1”

    rtsp地址: rtsp://mym9.com/rtsp_pull
    rtmp地址: rtmp://mym9.com/rtsp_pull
    hls地址: http://mym9.com:16880/rtsp_pull

  2. 相机使用gb28181推流到“小雉视频1_2”

    rtsp地址: rtsp://mym9.com/gb28181_push
    rtmp地址: rtmp://mym9.com/gb28181_push
    hls地址: http://mym9.com:16880/gb28181_push

  3. 从相机直接拉取rtsp到“小雉视频1_1”,
    “小雉视频1_1”再使用GB28181推流到“小雉视频2_1”,
    “小雉视频3_1”使用rtsp从“小雉视频2_1”拉取

    rtsp地址: rtsp://mym9.com/rtsp_pull_gb28181_push_rtsp_pull
    rtmp地址: rtmp://mym9.com/rtsp_pull_gb28181_push_rtsp_pull
    hls地址: http://mym9.com:16880/rtsp_pull_gb28181_push_rtsp_pull

  4. 从相机直接拉取rtsp到“小雉视频1_1”,
    “小雉视频1_1”再使用rtmp推流到“小雉视频2_2”,
    “小雉视频2_2”再使用rtsp推流到“小雉视频3_2”,

    rtsp地址: rtsp://mym9.com/rtsp_pull_rtmp_push_rtsp_push
    rtmp地址: rtmp://mym9.com/rtsp_pull_rtmp_push_rtsp_push
    hls地址: http://mym9.com:16880/rtsp_pull_rtmp_push_rtsp_push

  5. 从相机直接拉取rtsp到“小雉视频1_1”,
    “小雉视频1_1”再使用rtsp推流到“小雉视频2_3”,
    “小雉视频3_3”使用rtmp从“小雉视频2_3”拉取

    rtsp地址: rtsp://mym9.com/rtsp_pull_push_rtmp_pull
    rtmp地址: rtmp://mym9.com/rtsp_pull_push_rtmp_pull
    hls地址: http://mym9.com:16880/rtsp_pull_push_rtmp_pull

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/20/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


本文纯探讨技术实现,请大家抱着学习交流之目的进行阅览。

-rpath和-rpath-link的区别

(1)-rpath和-rpath-link都可以在链接时指定库的路径;
(2)运行可执行文件时,-rpath-link指定的路径不再有效(链接器没有将库的路径包含进可执行文件中),
           而-rpath指定的路径还有效(因为链接器已经将库的路径包含在可执行文件中);
(3)-L指定的是链接时的库路径,生成的可执行文件在运行时库的路径仍由LD_LIBRARY_PATH环境变量指定;

(4)不管采用何种选项链接,当提示找不到动态库时均可通过设置LD_LIBRARY_PATH解决。
其中 $$ORIGIN表示文件的当前路径,./表示应用程序的路径,一般-rpath,'$$ORIGIN'才能获得想要的效果;
-rpath,'$$ORIGIN',--enable-new-dtags 会在程序中加再加(RUNPATH)标签,参考http://www.feitianzhi.com/boke/index.php/archives/21/

gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 减小程序体积

GCC链接操作是以section作为最小的处理单元,只要一个section中的某个符号被引用,该section就会被加入到可执行程序中去。因此,GCC在编译时可以使用 -ffunction-sections 和 -fdata-sections 将每个函数或符号创建为一个sections,其中每个sections名与function或data名保持一致。而在链接阶段, -Wl,–gc-sections 指示链接器去掉不用的section(其中-wl, 表示后面的参数 -gc-sections 传递给链接器),这样就能减少最终的可执行程序的大小了。
我们常常使用下面的配置启用这个功能:

CFLAGS += -ffunction-sections -fdata-sections
LDFLAGS += -Wl,--gc-sections

让make更透明些

在编译信息里面看到详细的gcc/g++的编译参数

make VERBOSE=1

在CMakeLists.txt里面加上这句指令也可以

set(CMAKE_VERBOSE_MAKEFILE ON)