最近一段时间在解决转发网络摄像头视频信息的问题。参考了很多文章,因为自己对整个KMS项目一知半解,所以遇到好多问题。本篇不讨论如何搭建KMS流媒体服务器,以及如何定义一个自定义opencv模块。
假设你已经搭建了KMS服务,也实现了自定义的opencv模块——上面两部分前面我都大概搬过砖,也有很多链接,这里就不一一列举了。这里我们从如何集成自定义模块开始。
先说说KMS模块化的开发。核心模块三个
然后再来看一下继承关系,MediaObject 是所有元素的基类,通过【媒体管线】将各个实例化的对象串起来。串的过程就是
各个端点connect的过程,这个connect过程需要注意顺序。这里顺序可以认为就是业务逻辑。
先来熟悉几个核心的东西
媒体元素:其实就是根据不同业务场景抽象出的实例,比如如果希望接入RTSP视频流或者视频文件等,需要创建PlayerEndpoint, 如果需要做高清录播,需要通过RecorderEndpoint 指定存储路径等,如果需要发起视频会话,简单理解会话的过程,可以就流媒体信息进行过滤、分析等操作,所以需要依赖WebRtcEndpoint 。更深入的关系,暂时还没理清楚。
媒体管线:媒体关系是一个连接通道,把各个端点按业务逻辑需要串起来了,如果发生数据交换,应该就是通过管道实现的。
端点:端点就是实例化的媒体元素,真正操作的实体。
过滤器:端点可以connect到filter, 比如PlayerEndpoint 可以获取rtsp视频流信息,在开启webRtcEndpoint 会话后,可以连接到filter,对视频信息进行操作,然后把处理后的视频流信息输出到webRtcEndpoint。这个过程可以见下图。webRtcEndpoint 可以认为是抽象出来的支持webrtc协议的终端,可以支持流媒体信息的展示。
Hubs:暂时没涉及到,具体不清楚,大概知道,比如多路摄像头信息,需要混合输出,可能用到。
下面就这上面这个过程,分析一下这个过程。这里参考连接https://gist.github.com/WooDzu/870cb5a4700abddce55e。
- 通过websocket 创建kurentoClient 并实现与KMS的连接;
- kuentoClient 创建“MediaPipeline”,用来支持各个端点的连接;
- 构造PlayerEndpoint 从RTSP视频源获取信息,并开始播放;
- 构造WebRtcEndpoint 用来与PlayerEndpoint 建立会话(这里具体逻辑不太清楚,一直不清楚SDP是用来做什么的);
- 构造过滤器(因为构造的过程都是异步操作,串联的过程需要在各自的回调中完成,这个过程也许会有优化),实现自定义的业务逻辑;
- 然后是在webRtcEndpoint.processOffer(message.sdpOffer, function(error, sdpAnswer)过程中,实现PlayerEndpoint与过滤器的连接,实现视频信息的过滤。这一步很迷,我也不清楚为什么要这样操作,还是对整套系统运行逻辑不清楚。推测一下,也许到这一步,会话才真正建立了。有SDP请求,也获得了KMS的应答,所以流媒体的管道才算真正通了。
- 然后实现PlayerEndpoint 连接(connect)过滤器进行过滤,经过过滤的流媒体信息输出到支持的webRtcEndpoint端点进行显示了。
目前到这里,我觉得这个事情,我就能说道这么清楚了。中间还有好多环节不清楚。
又找了一张图,就是描述整个应用程序结构的,我们再来总结一下
- 首先是需要两个服务,KMS服务和应用程序服务;
- 应用程序服务通过kurento的API创建kurentoclient,用来创建MediaPipeline ,实现应用服务与KMS服务的通信;
- 然后用户通过应用服务,输入RTSP地址,kurentoclient 通过传入的信息,创建PlayerEndpoint和WebRtcEndpoint实现流媒体输入,然后连接各种过滤器,输出到WebRtcEndpoint,显示在支持webrtc协议的video元素上;
- 应用 服务中的各种信令不知道是用来做什么的;