基于EasyDarwin框架实现EasyNVR H5无插件直播流媒体服务器方案

本文主要是介绍基于EasyDarwin框架实现EasyNVR H5无插件直播流媒体服务器方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在之前的一篇博客《web无插件播放RTSP摄像机方案,拒绝插件,拥抱H5!》中,描述了实现一套H5无插件直播方案的各个组件的参考建议,又在博客《EasyNVR H5流媒体服务器方案架构设计之视频能力平台》中对整体的架构设计思路做了总结,做高内聚、低耦合的视频能力平台,不涉足业务部分!那么今天,我们来公开一下EasyNVR到底是如何实现这些功能的;

一、程序框架

熟悉EasyDarwin的同学都知道,EasyDarwin作为老牌的功能框架,在很多领域是非常能够满足开发者需求的,尤其是在安防领域,综合其架构和性能,性价比极高,尤其是在网络、多线程线程池、模块化设计等方面,熟悉之后,可以衍生出很多功能类型的服务,这里将要描述的EasyNVR就是其框架产物之一:EasyNVR based on EasyDarwin,底层网络事件模型完全沿用EasyDarwin,只对其HTTPSession、Module部分做二次开发,包括HTTP协议、Json的协议栈都完全复用EasyDarwin的HTTPProtocol类和EasyProtocol框架,非常方便;

EasyDarwin

二、模块设计

EasyNVR一共设计了两个Module:EasyNVRModule和EasyCMSModule:

  • EasyNVRModule的主要工作就是做EasyNVR通道管理的功能,进行摄像机源与推流的衔接,EasyNVRModule总管理多个EasyNVRChannel,一路EasyNVRChannel就是一个设备源,EasyNVRChannel继承自Darwin框架的Task类,这样每一个EasyNVRChannel就可以独立进行Task、Timeout、Event等多种功能了,这样就能非常方便地实现:设备在线监测、设备定时快照、设备直播流获取等多种功能,每一个EasyNVRChannel的所有输出都共享一个RTSPSource源,这样就能保证一路流媒体数据输入,多种协议(JPEG、RTMP、HLS)输出了!

  • EasyCMSModule是EasyNVR为了扩展云平台对接功能扩展的,与具体平台进行协议交互用到的,这个部分可以完全参考EasyDarwin的EasyCMSModule:https://github.com/EasyDarwin/EasyDarwin/tree/master/EasyDarwin/APIModules,对外的对接方法根据协议而定,这里就不多描述了;

EasyNVR

三、接口调用

在博客《基于EasyNVR二次开发实现自己的摄像机IPC/NVR无插件化直播解决方案》中,我们大概描述了EasyNVR是如何进行接口设计的,在代码实现上,我们直接复用了EasyDarwin的HTTPSession功能,实现基于http+json的接口协议,例如获取广场视频列表部分,我们在读取到请求后,直接从EasyNVRModule获取列表清单,反馈给客户端:

QTSS_Error HTTPSession::execNetMsgCSGetChannelsRESTful(const char* queryString)
{if(QTSServerInterface::GetServer()->GetPrefs()->liveStreamingAuth()){if (!isAuthenticate()) return EASY_ERROR_CLIENT_UNAUTHORIZED;}QTSS_Error theErr;QTSS_RoleParams params;params.easyNVRChannelsParams.inChannels = NULL;theErr = EasyNVRUtil::CallDispatch(Easy_NVRGetChannels_Role, QTSSModule::kGetChannelsRole, params);EasyProtocolACK rsp(MSG_SC_SERVER_GET_CHANNELS_ACK);EasyJsonValue header, body;header[EASY_TAG_VERSION] = EASY_PROTOCOL_VERSION;header[EASY_TAG_CSEQ] = 1;header[EASY_TAG_ERROR_NUM] = EASY_ERROR_SUCCESS_OK;header[EASY_TAG_ERROR_STRING] = EasyProtocol::GetErrorString(EASY_ERROR_SUCCESS_OK);if (theErr == QTSS_NoErr){std::map<int, EasyNVRChannel*>* pChannels = static_cast<std::map<int, EasyNVRChannel*>*>(params.easyNVRChannelsParams.inChannels);if (!pChannels)     return QTSS_BadArgument;Json::Value* proot = rsp.GetRoot();int i = 0;std::map<int, EasyNVRChannel*>::iterator it = (*pChannels).begin();while (it != (*pChannels).end()){CameraInfo* item = it->second->GetChannelInfo();if (item->enable != 0){Json::Value value;value[EASY_TAG_CHANNEL] = item->id;//value[EASY_TAG_ENABLE] = item->enable;value[EASY_TAG_ONLINE] = item->online;value[EASY_TAG_NAME] = item->name;value[EASY_TAG_SNAP_URL] = item->snap.empty() ? "" : item->snap;value[EASY_TAG_ERROR_STRING] = item->lasterror.empty() ? "" : item->lasterror;(*proot)[EASY_TAG_ROOT][EASY_TAG_BODY][EASY_TAG_CHANNELS].append(value);++i;}++it;}body[EASY_TAG_CHANNEL_COUNT] = EasyUtil::Int2String(i);}rsp.SetHead(header);rsp.SetBody(body);string msg = rsp.GetMsg();this->SendHTTPPacket(msg, false, false);return QTSS_NoErr;
}

诸如此类,按照这种方式实现每一个http接口功能即可实现完整一套的http接口功能,对外进行能力输出!

四、配套组件

在《web无插件播放RTSP摄像机方案,拒绝插件,拥抱H5!》中描述了很多组件:live555、ffmpeg、librtmp、faac等等,基于这些组件可以非常好地帮助您实现这些功能,但是这些组件都会存在不成熟或者不易使用的问题,EasyDarwin社区的开发者也实现了一系列此类功能的功能组件,例如:

EasyRTSPClient:类似于live555的RTSPClient功能组件,进行RTSP拉流;

EasyAACEncoder:AAC转码,将各种类型的安防音频格式转码成标准H5需要的AAC格式,开源项目地址:https://github.com/EasyDarwin/EasyAACEncoder

EasyRTMP:RTMP推流工具,能非常好地实现推流,重连,数据缓冲,过滤等等功能;

五、细节亮点

  • 按需直播

EasyNVR独特设计了一套按需直播的方案,也就是可以配置EasyNVR的通道只有在有人看的时候,才会从摄像机设备源取流到EasyNVR流媒体服务器进行直播,当没有客户端观看的时候,直接切断与源的连接,只做常态的设备状态监测和快照功能,降低带宽和服务器的压力;

具体实现:客户端页面需要不断向EasyNVR发送心跳包,保持具体某一个通道的流状态,当超时时间内某通道没有获得心跳包,那么就认为该通道无人观看,即停止从设备拉流!

  • token认证

EasyNVR实现了一套authToken验证机制,客户端调用登陆接口后,客户端会获取到一个token,在本次操作的过程中,只要在http cookies中携带token,即可操作EasyNVR其余接口,如果不携带token或者携带的token已经过期,EasyNVR会返回401,这样客户端需要重新调用EasyNVR登陆接口获取新的token!

  • 占位设计

我们经常在做服务器时会遇到内外网映射的问题,当外网客户端请求一个通过端口映射出来的内网服务器时,内网服务器往往不知道其所在的公网的IP地址,如果每次都是通过配置IP的方式,一方面是很麻烦,另一方面,很多网络路由规则会限制内网的客户端不能请求该内网所在的公网的IP,也就是内网的客户端不能请求自己的公网IP的对外服务,内网的只能通过内网路由,而且内网请求内网IP就获取到的是内网的直播流地址也是很合理的需求,于是,我们设计了一套占位方案,比如客户端请求一个RTMP的直播地址,我们返回给客户端的地址是:rtmp://{host}:10935/hls/channel_1,那么客户端再根据自己请求到EasyNVR的host IP,替换{host}占位符,就实现了,内网用内网的IP,公网用公网的IP了!

关于EasyNVR

EasyNVR能够通过简单的网络摄像机通道配置,将传统监控行业里面的高清网络摄像机IP Camera、NVR等具有RTSP协议输出的设备接入到EasyNVR,EasyNVR能够将这些视频源的音视频数据进行拉取,转换为RTMP/HLS,进行全平台终端H5直播(Web、Android、iOS),并且EasyNVR能够将视频源的直播数据对接到第三方CDN网络,实现互联网级别的直播分发;

详细说明:http://www.easydarwin.org/easynvr/

获取更多信息

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

Copyright © EasyDarwin.org 2012-2017

EasyDarwin

转载于:https://www.cnblogs.com/babosa/p/7518017.html

这篇关于基于EasyDarwin框架实现EasyNVR H5无插件直播流媒体服务器方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/722217

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount