我们大致拆分一下RTSP转RTMP流程:
痛点提要:
在每一款设备的RTSP协议输出方式上,区别就各种各样了,有的是一个系列产品会有一个地址格式,有的是没有格式,直接IP+Port对了就可以,有的只支持UDP协议(例如很多移动终端设备或者mifi设备),最靠谱的还属于大厂(海康、大华)了,格式基本确定,而且流输出比较稳定;
下面我就对怎么获取到一款设备的RTSP地址说一下自己的经验:
判断摄像机IP Camera、网络硬盘录像机NVR是否支持RTSP协议,有一个非常基础的参考,就是在设备的后台配置中,查找是否有关于RTSP端口的配置,如果设备有RTSP端口的配置,那基本上该设备是支持RTSP协议的;
对于较为近期生产的大部分的视频设备:网络摄像机、网络硬盘录像机NVR基本都支持Onvif协议,RTSP地址通过Onvif发现就可以了,Onvif的发现工具大家可以到 www.easynvr.com 下载Onvif工具,通过Onvif探测就能够获取到RTSP地址;
对于没有Onvif辅助的设备,判断了设备支持RTSP协议后,就是找具体RTSP地址规则了,那么对于市面上的大部分摄像机那都基本上是海康大华的天下了,尤其是海康。这里就对我所接触的各家设备的RTSP地址做一个汇总:
海康DS系列设备:《最新海康摄像机、NVR、流媒体服务器、回放取流RTSP地址规则说明
》
海康其他老设备:《海康、大华IpCamera RTSP地址和格式》
大华设备:《海康、大华IpCamera RTSP地址和格式》
宇视设备:《宇视摄像机RTSP地址格式规则》
杂牌设备:杂牌设备的建议是,直接采用 rtsp://ip:port/试着播放一下,然后再就是去具体厂家问了,很多小厂不把RTSP做为主要输出内容,所以这一块做的也比较乱,效果一般;
目前市面上两套相对较好的RTSP协议拉流技术框架,一个是live555,一个是ffmpeg,两套框架各有千秋,各有一系列的成功的案例:
所以说,开源+商业化才是持久之道!
我们在这一块分别参考live555和ffmpeg打造了两款RTSPClient工具:EasyRTSPClient和EasyStreamClient,这都是对几十万行级别代码的优化输出,站在巨人的肩膀上!
源自EasyRTSPClient Github介绍:An elegant, simple, high performance & high compatibility RTSP Client Utility,can use in RTSP Player,NVR,RTSP Relay,EasyRTSPClient can run in any platform ,such as x68/x64/Windows/Linux/Android/iOS/arm etc…,with flexible interface,EasyRTSPClient can fit almost all network IPCamera,very easy to use.简单、稳定、高效、易用的RTSPClient工具,支持Windows、Linux、ARM、Android、iOS等几乎所有平台,支持RTP Over TCP/UDP,支持断线重连,能够接入市面上99%以上的IPC,调用简单且成熟稳定!Github地址:https://github.com/tsingsee/EasyRTSPClient
EasyStreamClient:是一套RTSP、RTMP、HTTP等网络协议的拉流库,基本上只要是ffmpeg支持的,EasyStreamClient都支持,而且EasyStreamClient简化了调用的流程,强化了输出的结果,最重要的是支持了重连功能,非常易用!Github地址:https://github.com/tsingsee/EasyStreamClient
不能小视这两个功能组件的重要作用,在很多应用和项目中,大量的时间都是耗在这两个上面,每一家的设备都不一样,对协议标准的理解各有出入、各有一定的bug,作为直接面向一线设备的工具,大部分的兼容工作都在这两个组件上。
跟RTSPClient拉流一样,RTMP推流同样有两个非常值得参考的开源项目:librtmp和ffmpeg,相比较来说,这里的ffmpeg推流在兼容性和持续输出上,会有一定局限,而且定制起来也会流程相对比较繁琐,我们目前主要的RTMP推流采用的是EasyRTMP。
EasyRTMP是一套调用简单、功能完善、运行高效稳定的RTMP功能组件,经过多年实战和线上运行打造,支持RTMP推送断线重连、环形缓冲、智能丢帧、网络事件回调,支持Windows、Linux、arm(hisiv100/hisiv200/hisiv300/hisiv400/etc…)、Android、iOS平台,支持市面上绝大部分的RTMP流媒体服务器,包括Wowza、Red5、ngnix_rtmp、crtmpserver等主流RTMP服务器,能够完美应用于各种行业的直播需求,手机直播、桌面直播、摄像机直播、课堂直播等等方面! Github地址:https://github.com/EasyDSS/EasyRTMP
我们几乎全线的产品都采用的是EasyRTMP进行的流媒体音视频标准化,EasyRTMP能够将输入的H.264、H.265、AAC进行非常低延时以及平滑的流转,这个是目前我们在视频标准化推流输出上唯一的选择!
在数据的流转上,用一个简单的ffmpeg.exe是可以完成的,简单的ffmpeg -i rtsp://xxx -vcodec h264 -acodec aac -f flv rtmp://xxx,但是最终都返工了!为什么呢?
用ffmpeg只能做到一个基本的DEMO演示的作用,在容错机制以及应对不同网络情况时,会有诸多的问题,例如,ffmpeg不能重连,只能靠手动控制其重新连接,或者采用程序反复调用连接,另一方面,存在兼容的问题,而且资源消耗非常大,在某些ffmpeg拉流转推流的场景下,ffmpeg对资源的消耗非常大;
还有一个是ffmpeg拉转推延时不可控,对于用户来说,属于一个黑盒状态,出了问题啥情况都不知道;当我们还想进行一些数据分析时,这种黑盒我们是没办法伸手进去做中间数据的获取和处理分析的;
为了解决以上描述的这些问题,我们分别开发了EasyRTSPLive、EasyRTMPLive ,区别在于EasyRTSPLive只针对于RTSP协议的RTMP转推,而EasyRTMPLive是对于各种各样的流媒体协议的输入,例如RTSP、RTMP、HTTP、HLS等等等等的协议格式,都可以采用EasyRTMPLive输入,并做RTMP标准化输出,而且EasyRTMPLive所使用的EasyStreamClient还自带了软转码的功能,能将各种非标的音视频格式都能转化成为标准的格式进行输出;
EasyRTSPLive需要将安防输入的各种音频格式,例如PCMA(G.711A)、PCMU(G.711U)、G.726,进行转码成为互联网需要的AAC音频格式,AAC音频编码可选择用EasyDarwin开源的EasyAACEncoder,基于faac内核,效果非常好,而且现在很多支持浮点计算的芯片都能支持;
EasyNVR 是另一款基于EasyStreamClient和EasyRTMP的产品化程度更高的产品,这里只做一个大概的描述,就不深入讨论了:EasyNVR是一款拥有完整、自主、可控知识产权,同时又能够具备软硬一体功能的安防互联网化流媒体服务器,能够通过简单的网络摄像机通道配置,将传统监控行业里面的高清网络摄像机IP Camera、NVR等具有RTSP、Onvif协议输出的设备接入到EasyNVR,EasyNVR能够将这些视频源的音视频数据进行拉取,转换为RTMP/HLS,进行全平台终端H5直播(Web、Android、iOS),并且EasyNVR能够将视频源的直播数据对接到第三方CDN网络,实现互联网级别的直播分发。
EasyRTSPLive:能方便有一定视频能力的开发者或者公司进行集成开发,而且对程序包体大小有要求,尽量要求精简、专注于RTSP等等特点;
EasyRTMPLive:如果想做一款全功能、全协议的视频编码器,那可以采用EasyRTMPLive,支持协议全、兼容扩展方便、站在ffmpeg巨人的肩膀上;
如果想低成本、快速、稳定、可靠、有效达到目标建议用EasyNVR;