我们大致拆分一下RTSP转RTMP流程:
- 设备RTSP地址的获取;
- RTSP协议拉流;
- RTSP转RTMP数据的处理;
- RTMP推流;
痛点提要:
- 拉流可以用ffmpeg、live555、EasyRTSPClient,利弊分析;
- 推流可以用librtmp、ffmpeg、EasyRTMP,利弊分析;
- 音频转换可以用ffmpeg、faac、EasyAACEncoder,利弊分析;数据流经过主程序,在一些视频分析、数据分析、抓图的过程有需要,数据可控;
- 整体方案推荐EasyRTSPLive,因为亲切、成功案例较多、支持重连、调用示例完整、技术支持完备;
一、设备RTSP地址的获取
在每一款设备的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协议的视频设备,比如很多特别贵的热成像设备(输出的分辨率还特别低),这些设备一般情况下只能通过SDK接入,那么我们也可以通过EasyIPCamera (https://github.com/EasyDarwin/EasyIPCamera)或者 EasyRTSPServer(https://github.com/tsingsee/EasyRTSPServer) 将这些非标设备进行RTSP标准化改造,先通过设备SDK取流到Server端,再通过EasyIPCamera或者EasyRTSPServer进行输出;
二、RTSP协议拉流
目前市面上两套相对较好的RTSP协议拉流技术框架,一个是live555,一个是ffmpeg,两套框架各有千秋,各有一系列的成功的案例:
- live555:非常老牌的RTSP框架,十几年了,还在迭代与维护,作者Ross也以此为业,进行着开源+商业的运营,大家所熟知的VLC播放器,RTSP拉流采用的就是live555;
所以说,开源+商业化才是持久之道!
- ffmpeg:ffmpeg就更不用说了,目前国内大部分的播放器,都用这个,RTSP模块自写自带的,兼容性也非常不错,不过要定制起来,流程就比较复杂;
我们在这一块分别参考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,作为直接面向一线设备的工具,大部分的兼容工作都在这两个组件上。
三、RTMP推流
跟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进行非常低延时以及平滑的流转,这个是目前我们在视频标准化推流输出上唯一的选择!
RTSP转RTMP数据的处理
在数据的流转上,用一个简单的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;