本文转载自微信公众号《java开源精选》,作者姚生。转载本文请联系java开源精选公众号。背景最近在研究流媒体、RTSP、SIP等,目的有二:一是寻找基于云端的查看局域网监控的解决方案,二是实现SIP可视对讲与门禁联动。云视频监控云视频监控有三种解决方案:1、开发SIP服务器,实现GB28181协议。海大鱼的IPC摄像头也基本支持,但是如果有存储30天的需求,云盘上云太贵了。2、上下级联动,通过海大鱼的SDK调用摄像机NVR(一般提供IPC摄像机)或者硬盘录像机,然后推送到云端。3、上下级联动,通过RTSP拉流视频(摄像头一般都支持此协议),在下发指令到云端时将实时或之前的视频推送到云端。之前选择的云视频监控方案是购买h5stream,可以上下联动,简单易用,可以支持海大鱼等主流摄像头。但是由于每台机器都需要部署一个license,比较烦人;操作步骤是先部署,再通过邮件申请license,然后激活。需要做两次,没办法直接访问。在实施物联网的时候尤其尴尬。费用也不贵,100元左右一个license。然后重新开始研究。2020年初,疫情假期,根据网上教程,使用nginx-RTMP+OBS做了一个流媒体直播。浏览器调用.m3u8分流,但分流延迟太高。在研究SIP的时候,发现有一个不错的国人开发的C++流媒体库,ZLMediaKit;地址是https://github.com/xia-chu/ZLMediaKit。并且很多优秀的作者基于ZLMediaKit开发了相应的SIP服务,实现了公安制定的国家标准GB28181-2011和GB28181-2016协议。在猪群问有没有java实现的流媒体库。有同学说red,于是搜索了一下,发现red5的github还在更新维护中,算是一个选项。但是最新的red5版本是基于jdk11的,有点尴尬。群里的另一位同学在知乎上贴出了答案。虽然已经是2015年了,但还是有参考价值的。可以看看:Live555(C++)流媒体平台框架EasyDarwin(C++,国内精品)实时流媒体服务器程序DarwinStreamingSrvr(C++)Flash流媒体服务器Red5(Java)流媒体服务器OpenStreamingServer(Java)FMS流媒体服务器(Adobe,付费)Wowza流媒体服务器(Java)开源流媒体平台FreeCast(Java)发布地址:https://www.zhihu.com/question/31160392。Live555和EasyDarwin都是很好的解决方案。EasyDarwin还在合肥,是一家叫清溪的公司。上面没有列出,我研究了liveGBS和h5stream。这几种解法可以上下联动,但是因为价格,主要是清溪千潞比较贵。我们还没有那个水平。所以我选择了h5stream,可以批量购买。SIP音视频对讲说完视频监控,我们再来说说SIP音视频对讲。如果你只是做SIP音视频对讲,我找到了一个很好的解决方案,就是flashphoner,地址https://flashphoner.com/。Android、ios、web都支持。然后在查看flashphoner的过程中,发现了这篇帖子【25款常见的免费SIP软电话】,地址:https://zhuanlan.zhihu.com/p/313345953。列表如下:XLite(现为BriaSolo)linphoneMicroSIP3CXSoftphoneZoIPerBlinkGrandstreamWAVE(Qutecom)WengoDamakaAdoreSoftphoneMiniPAXMizuPhoneFlashPhoneFaramPhoneMirialSoftphoneWXCommunicatorTwinkleIAXCommSJLabsSJPhonePhonerDIAXExpressIMTalkIPT-MaxroDials。如果选择后端流媒体方案,前端如何播放?我想到了使用webRTC。在搜索webRTC的时候,找到了极客时间李超的课。在他的音视频直播课上,他还推荐了几款开源的流媒体软件:licode、Janus-gatewayMediasoupMedoozeMeooze、Mediasoup、Licode三流媒体服务器的媒体通信部分是用C++实现的,控制逻辑是由Node.js实现。Janus-gateway完全用C语言实现。据说可以支持500人的多人视频。生意上还有大牛直播。据我自己介绍,延迟极低,适合做直播业务。这些是研究后的想法。这些是当前研究的一些结果。有些还没有深入研究。有些部署起来比较麻烦,部署了半天,就放弃了。目前的想法是,把所有的视频都推到云端肯定不现实,而且带宽太贵了。于是准备在局域网部署客户端,拉取RTSP,使用webRTC或者其他js工具播放,然后使用frp等渗透软件,直接将服务暴露给外网访问。甚至可以把js中的播放地址换成局域网中的播放地址,使用iframe嵌套。只要解决了跨域问题,就可以直接在客户端的局域网上播放视频。当然如果不对应局域网内的客户端访问就尴尬了,所以需要隔离云访问和本地访问。回过头来看,我们用A区的电脑访问A、B两个局域网中的系统,然后在B区显示摄像头,也不是不可以。点用NAT转换的方式,也不是不可以-点对点访问。作为隧道,流量能否突破带宽限制?目前的想法可能和主流的方案不一样,不知道能不能实现。做吧,不然带宽真的是个大问题。至于可视对讲,如果自研,目前倾向于使用ZLMediaKit在其上实现SIP信令。不过可视对讲方案比较成熟通用,没有个性化的要求,所以大家多对比几家商业公司应该就可以确定了。附录:术语简析RTSP:实时流协议(RealTimeStreamingProtocol)。流媒体公共协议,专门用于控制流媒体服务器。如播放、录音和暂停。基于UDP协议,传输ts(.m3u8)、MP4格式流。目前多用于安防领域。RTMP:实时消息协议。目前是Adobe的私有协议,尚未完全公开,功能与RTSP相同。基于TCP协议传输flv、f4v格式流是目前比较主流的流媒体协议。有很多变体,请参阅wiki了解详细信息。RTSP一般需要2-3个通道,数据通道和命令通道分离,RTMP和HTTP在一个通道上传输命令和数据。SIP:SessionInitiationProtocol(会话发起协议),由IETF(InternetEngineeringTaskForce,互联网工程任务组)制定的一种多媒体通信协议,又称为信令协议,因此SIP业务也称为信令业务。SIP可用于创建、修改和终止交互式用户会话,包括视频、语音、即时消息、在线游戏和虚拟现实等多种多媒体元素。
