本文转载自微信公众号「java开源精选」,作者妖生 。转载本文请联系java开源精选公众号。
背景
最近在调研调研流媒体、RTSP、SIP之类的,两方面的目的:一是找一个云端查看局域网监控的方案,一个是实现与门禁联动的SIP 可视化对讲。
云端视频监控
云端视频监控有三种方案:
1、开发SIP服务器,实现GB28181协议,海大宇的IPC摄像头也基本支持,但是如果有存储30天的这种需求,对于云端来说,云盘就太昂贵了。
2、上下级联动,通过海大宇的SDK调用摄像头NVR(IPC摄像头一般自带)或硬盘录像机,再推送云端。
3、上下级联动,通过RTSP(摄像头一般都支持此协议)拉流录像,在云端下发命令时推送实时的或曾经的录像视频至云端。
云端视频监控之前选定的方案是采购h5stream,可以上下级联动,使用简单,海大宇等主流摄像头都可以支持。
但是因为需要每台机器都部署一个license,比较烦人;操作步骤是先部署,再邮件申请license,再激活,要弄两次,没法直接接入,在物联网实施的时候特别尴尬。费用倒是不贵,一个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)流媒体服务器
- Open Streaming Server (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 (Now Bria Solo)
- linphone
- MicroSIP
- 3CX Softphone
- ZoIPer
- Blink
- Grandstream WAVE
- (Qutecom)Wengo
- Damaka
- AdoreSoftphone
- MiniPAX
- MizuPhone
- FlashPhone
- FaramPhone
- Mirial Softphone
- WXCommunicator
- Twinkle
- IAXComm
- SJLabs SJPhone
- Phoner
- DIAX
- ExpressTalk
- T-Max Dialer
- IPComms
- IMSDroid
当然,并没有一一验证。
如果选好了后端的流媒体方案,前端的播放怎么弄?想到了使用webRTC。
在搜寻webRTC的时候,找到了极客时间李超的课,在其音视频直播课中,也推荐了几款开源的流媒体软件:
- licode、
- Janus-gateway
- Mediasoup
- Medooze
Meooze、Mediasoup、Licode这三个流媒体服务器的媒体通信部分都是由 C++ 实现的,控制逻辑通过 Node.js 实现。Janus-gateway是完全通过 C 语言实现的。据说是都可以支持500人的多人视频。
商业上还有个大牛直播,据自己介绍延迟极低,适合做直播服务。
调研后的想法
就这些吧,这是目前调研的一些成果。有些也并没有做深入的研究。有些部署起来较为麻烦,花了半天没部署好,就放弃了。
目前的想法是将视频全部推到云端肯定不现实,带宽太贵了。所以准备在局域网中部署客户端,拉流RTSP,使用webRTC或其他js工具播放,然后使用frp这类穿透软件,可以直接暴露服务给外网访问。
甚至可以将js中的播放地址替换为局域网中播放地址,使用iframe的方式嵌套,只要解决跨域问题,就可以直接让视频在客户局域网的本机上播放。
当然,如果不是对应局域网内的客户机访问就很尴尬了,所以还要做好云端访问与本地访问的隔离。
回过头来想想,我们在A、B两个局域网,使用A区的电脑访问系统,然后展示B区的摄像头,也不是不可以,使用NAT转换的方式,进行点对点访问就行了,只是把云端作为一个隧道,那流量是不是可以破开带宽的限制呢?
目前的想法可能有别于主流的解决方案,也不知道能不能实现。做做看,否则带宽真的是个大问题。
至于可视化对讲,如果自研的话,目前倾向于采用 ZLMediaKit,在其上实现SIP 信令。
但是可视化对讲方案是比较成熟、通用的,也没有个性化的需求,所以找几家商业公司比较下,应该就可以确定了。
附录:名词简析
RTSP:实时流协议(Real Time Streaming Protocol)。流媒体公有协议,专门用以控制流媒体服务器。如播放,录制和暂停。基于UDP协议,传输ts(.m3u8)、MP4格式流。目前多用于安防领域。
RTMP:实时消息协议(Real-Time Messaging Protocol)。目前是Adobe的私有协议,未完全公开,跟RTSP拥有一样的功能。基于TCP协议,传输flv、f4v格式流,目前是比较主流的流媒体协议。有很多变种,具体看维基。
RTSP一般需要2-3个通道,数据和命令通道分开,RTMP和HTTP在一个通道上传输命令和数据。
SIP:会话发起协议(Session Initiation Protocol),由IETF(Internet Engineering Task Force,因特网工程任务组)制定的多媒体通信协议,也被称作信令协议,所以SIP服务也称作信令服务。
SIP可以用于创建、修改和终止包括视频、语音、即时通信、在线游戏和虚拟现实等多种多媒体元素在内的交互式用户会话。