• 广播与P2P通道(上) 问题与方案


    我们设想一下网络视频会议的场景:在一个视频会议虚拟房间中,每个人都需要将自己的视频数据发送给房间中的其它人,从而实现在同一个地方进行实时会议的效果。为了简单起见,我们假设,这个虚拟的视频会议房间中只有三个人,其结构可以简化描绘如下:

       

    客户端A需要将自己的视频数据发送给B和C,客户端B需要发给A和C,客户端C需要发给A和B。有了这个场景基础,接下来,我们将从数据传送通道的角度来分析在这个模型中可以采用的通道方式,以及进行对比并找出最优的通道模型。所谓最优,就是服务器所占用的带宽(包括上行和下行)最小,因为在现实的视频会议案例中,带宽是不可忽视的成本之一。为了下面能进行更具体的数据分析和比较,我们假设视频的大小为320*240,帧频为10fps,这样,一路视频流经过编码后,所需的码率大概为30KByte/s。

    1.模型1:最简单的通道模型

    对于上述场景,我们第一反应能想到的解决方案的要点:

    (1)所有的视频数据都经过服务器中转。

    (2)以客户端A为例,对于采集到的每一帧视频,调用两次发送方法,一次发送给B,一次发送给C,都经过服务器中转。客户端B和C也是同理。

    (3)服务器仅仅转发数据,不需加入任何其它的逻辑。

    现在,我们计算一下服务器的带宽占用。

    上行:30*2*3 = 180KByte/s。(每个客户端需要上传两份相同的视频流,3个客户端)

    下行:30*2*3 = 180KByte/s。(每个客户端需要下载另外两个用户的视频流,3个客户端)

    在这种模型下,上下行是完全对称的。这个模型有个很明显的缺陷:每个客户端采集的每一帧视频都需要上传两次。修正这个缺陷也很容易,在服务端引入广播功能。

    2.模型2:在服务端进行广播

    在第一个模型的基础上,我们在服务端增加广播功能,将视频帧的接收者的决定权由客户端转交给服务器:

    (1)客户端将采集的每一帧发送给服务器,服务器收到该帧后,根据当前会议的参与者,决定需要将视频帧转发给哪几个客户端。

    (2)以客户端A为例,对于采集到的每一帧视频,只需调用一次发送给服务器的方法。

    我们再来计算一下服务器的带宽占用。

    上行:30*3 = 90KByte/s。(每个客户端上传自己的视频流,3个客户端)

    下行:30*2*3 = 180KByte/s。(每个客户端需要下载另外两个用户的视频流,3个客户端)

    在这种模型下,上下行不再对称了,上行的流量减小了一半,效果还是很明显的。

    3.模型3:结合P2P通道

    为了进一步减少服务器的带宽占用,我们还有一个杀手锏,那就是在模型2的基础上使用P2P通道。理想的情况下,A和B以及C相互之间的P2P通道都可以创建成功,这样,就没有任何数据需要经过服务器中转了,所以,服务器的上行和下行的带宽占用都是0。但是,现实中常见的情况很复杂。比如,假设客户端C的路由器的NAT是对称型的,那么,C和A以及C和B之间的P2P通道无法创建成功,但A和B之间的P2P是成功的。基于此假设,我们希望,A和B之间的数据经过P2P通道直接传送,A和C以及B和C之间的数据只有经过服务器转发:

    (1)A通过P2P通道将视频帧发送给B,并通过服务器中转给C。

    (2)B通过P2P通道将视频帧发送给A,并通过服务器中转给C。

    (3)C通过通过服务器将视频帧中转给A和B。 

    我们再来计算一下服务器的带宽占用。 

    上行:30*3 = 90KByte/s。(每个客户端都要上传自己的视频流,3个客户端) 

    下行:30 + 30 + 30*2 = 120KByte/s。(A需要下载C,B需要下载C,C需要下载A和B)

    可见,由于P2P通道的存在,降低了下行带宽的占用量。 

    4.服务器广播与P2P通道结合深入分析

    现在,我们将参与视频会议的人数扩展到N(N>=2),情况依然是复杂的,某些客户端之间的P2P通道成功建立,而某些客户端之间的P2P通道无法创建成功。在这种情况下,如何才能将服务器广播模型与P2P结合起来了?需要做到以下几点:

    (1)每个客户端需要记录自己与哪些用户创建了P2P通道。

    (2)服务器也要知道每个客户端的P2P通道的状态。(客户端的P2P通道状态发生变化时,及时报告给服务器)

    (3)当服务器收到一个视频帧时,首先,查看当前参与会议的用户,然后,根据视频帧的发送者的P2P通道状态,来综合决定该视频帧需要转发给哪些客户端。

            (比如本文的例子,服务器收到A的视频帧,发现A和B之间的P2P是通的,所以,它就只将该帧转发给C。)

    (4)在客户端发送视频帧时,又可细分为三种情况:

      a.当某个客户端发现自己和所有的与会者都建立了P2P通道时,那么,它就不用把视频帧发送给服务器了。

      b.如果客户端与所有与会者的P2P通道都没有建立成功,那么,它只需要将视频帧发送给服务器。

      c.如果客户端与部分与会者建立了P2P通道,那么,它不仅需要将视频帧发送给服务器,还需要将该帧经过每个P2P通道发送一次。

    本篇我们提出了广播消息与经服务器中转、P2P通道传送等方案结合时,可能发生的各种情况,以及在每种情况下服务器消耗的上行与下行的带宽。综合看来,模型3对服务器带宽的占用是最少的,但是,其实现也是最复杂的。我们将在下篇详细介绍基于ESFramework通信框架对上述模型3的完整实现,敬请期待。

     

  • 相关阅读:
    MyBatis自带的逆向工程
    StringUtils.isNotEmpty和StringUtils.isNotBlank的区别
    JS根据身份证号码精确计算年龄和性别
    java根据生日精确计算年龄
    单列模式
    Java事务处理
    数据库连接池
    CRM(四川网脉系统)项目总结
    流的文件操作(File)
    Java的关键字与标识符
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/3012448.html
Copyright © 2020-2023  润新知