0

    基于live555实现sip-rtsp媒体网关或媒体服务器

    2023.07.02 | admin | 210次围观

    前面的文章我们已经实现了rtsp->sip;ESPS媒体互转的流媒体服务器,或者媒体网关功能,可以支持媒体转发和分发功能;如果是做视频监控的流媒体服务器或者网关的话,通常还需要补充sip->rtsp协议实现;这边文章就干脆补充完整。

    要实现sip->rtsp协议的媒体转发服务器,其实方案很多,随便移植一个开源的sip协议栈,然后集成一个rtspclient进去就可以实现了,例如osip做UAS + live555做rtspclient,或者pjsip +rtspclient等等,这些都不是我要说的方法。我的方法是接着前面的媒体网关补充一个简单的sipuas实现即可,整体构成sip-rtsp,es-ps可随意互转的视频监控媒体代理服务器,同时兼容onvif和gb28181应用场景的媒体网关;

    主要有以下开发步骤:

    1、移植osip、EXosip开发实现uas,网上有一些例程代码,我这里就不贴了;

    2、将live555的rtspServer封装成媒体处理的api供uas调用,实现媒体转发;

    3、根据实际需求情况,控制媒体流输出格式,可以通过配置控制输出es流还是ps流,或者sip协议绑定ps流对应gb28181场景,rtsp协议绑定es流对应onvif应用场景即可,前面的文章实际也给出了这部分代码,所以也不再重复给出了。

    基于live555实现sip-rtsp媒体网关或媒体服务器

    下面主要概述一下,live555封装成媒体处理API供osip的uas调用的思路:

    1、osip的uas中收到invite消息rtsp协议服务器怎么知道往哪里法流,解析会话信息,以及sdp,将sdp的必要信息,通过参数传给基于RTSPServer::RTSPClientConnection::handleCmd_DESCRIBE封装的API处理;

    2、接下来在基于RTSPServer::RTSPClientConnection::handleCmd_DESCRIBE封装的API末尾,调用基于RTSPServer::RTSPClientSession::handleCmd_SETUP封装的API,同样继续调用基于RTSPServer::RTSPClientSession::handleCmd_PLAY封装的API;将live555分配或者生成的端口等sdp信息通过回调,反馈给osip的uas调用,基于这些live555的sdp信息,构建osip invite的200OK响应即可。以上流程实际就是将rtspserver的整个处理流程封装成一个api供osipuas调用,而封装方法也不复杂,直接参照原函数重写handleCmd_DESCRIBE、handleCmd_SETUP、handleCmd_PLAY三个函数即可,这三个函数中,需要的入参基本sipinvite(sdp)都能提供rtsp协议服务器怎么知道往哪里法流,无关的删除即可。当然,过程中,同样可以兼容,之前的异步查询前向的rtsp或sipurl的流程;

    3、最后sip的ack消息,协议栈默认处理即可。该流程仅实现了invite(sdp)->200 OK(sdp)->ack业务逻辑,invite->200 OK(sdp)->ack(sdp)等其他sipcase视频监控好似不常用,就不介绍了;

    4、最后uasbye释放的时候,需要通过上面构建的上下文,以及ProxyServerMediaSession信息,模拟handleCmd_TEARDOWN函数处理即可。

    基于上面思路实现并不难。这个流程看似简单,实际配合前面实现的rtsp代理服务器,可以完整的构建sip-sip,rtsp-rtsp,sip-rtsp,rtsp-sip,es-ps流等任何组合的多媒体网关系统。覆盖视频监控流媒体处理的几乎所有处理场景。

    当然,如果想用vms实现sip协议的信令和媒体分离的处理,一般就没有必要引入上面的媒体网关,媒体直接通过sip协议+p2p实现了,无需中转。后面有时间的话,我也可能会给出这个方案的实现以及代码示例。

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论