webrtc入门:11.Kurento中使用RtpEndpoint拉取rtp流在直播中做集群

在webrtc中,如果只是做一对一的连接,服务器的处理相对还是比较简单的,如果这台服务器满了,可以直接在开启另外一台服务器,但是在一对多的直播中,这种方式就行不通了。

在kms中,能够实现一对多的直播功能,是因为在kms服务器中有一个WebRtcEndpoint,我们把它理解为在kms上相当于创建了一个webrtc客户端,相当于一个虚拟的 客户端,他能接受主播通过webrtc推送的协议,这个虚拟的客户端获得了主播的流,在和观看者进行连接,把流推给观看者。

在这里插入图片描述
这种模式下,能容纳多少个观看者,取决于单台服务器A的极限,假设一台服务器的流量只能支持200个的观看者,那么主播的最多只能有200个观看者,这样极限就非常的大了。

有没有办法解决这个问题呢?

在这里插入图片描述

通常解决这列问题的方式,都有现成的解决方案了,就是拓展服务器,也就是先把流推一路到服务器B,依次类推,这样就可以到达理想中的任意人数。

而在webrtc中,关键就是把rtp的流推到另外的服务器上。

在kms中有几个Endpoint,我们是要注意的,一个是前面讲的WebRtcEndpoint,另外一个是RtpEndpoint,看看官方文档是怎么介绍的。

在这里插入图片描述
文档 告诉我们,RtpEndpoint可以用来建立RTP的连接,可以通过SDP的沟通后自动建立连接,这个跟我们的webrtc的连接是一样的,除了一点,他不用进行ICE的沟通。

具体的流程如下:

媒体服务器A 在连通了主播以后,需要创建出RtpEndpoint,连接到原来的WebRtcEndpoint上,并生成RtpEndpointSDP,创建服务器B 上的媒体管道,通过管道创建RtpEndpoint,并处理A的SDP,A的RtpEndpoint应答SDP,服务器B创建出WebRtcEndpoint连接到自家的RtpEndpoint上,就可以用WebRtcEndpoint来进行观看者连接了。

时序图如下:

在这里插入图片描述

流程的代码如下:

RtpEndpoint rtpEndpoint = new RtpEndpoint.Builder(presenter.getPipeline()).build();
presenterWebRtc.connect(rtpEndpoint);

KurentoClient kurentoB = KurentoClient.create("ws://xxxx/kurento");

MediaPipeline pipelineB = kurentoB .createMediaPipeline();
RtpEndpoint rtpEndpointB = new RtpEndpoint.Builder(pipelineB).build();

String offerString = rtpEndpoint.generateOffer();
String sdpAnswerViewer = rtpEndpointB .processOffer(offerString);
rtpEndpoint.processAnswer(sdpAnswerViewer);

...

rtpEndpointB .connect(viewerWebRtc);

看看kms的源代码,看看kms在处理完SDP后,会做什么动作,深入到最后,我们会发现,在kms_utils_depayloader_monitor_pts_out 下会 生成1个新的pts输出。

void
kms_utils_depayloader_monitor_pts_out (GstElement * depayloader)
{
  GstPad *src_pad;

  GST_INFO_OBJECT (depayloader, "Add probe: Adjust depayloader PTS out");

  src_pad = gst_element_get_static_pad (depayloader, "src");
  gst_pad_add_probe (src_pad,
      GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_BUFFER_LIST,
      (GstPadProbeCallback) kms_utils_depayloader_pts_out_probe,
      kms_utils_adjust_pts_data_new (depayloader),
      (GDestroyNotify) kms_utils_adjust_pts_data_destroy);
  g_object_unref (src_pad);
}

这就是 KMS在不同服务器上拉RTP流的过程和原理了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go2coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值