c语言聊天神器(实现多人语音聊天)

这里是OMCS中与多人语音视频相关部分的原理及方案的介绍。

一、动态组

  OMCS采用“动态组”的模式来实现多人语音/视频聊天组,所谓“动态组”,就是在运行时动态创建和销毁的组,其包含如下几层意思:

(1)当某个用户要加入一个不存在的动态组时,OMCS服务器会首先自动创建这个组,然后,再把用户放进这个组。

(2)当用户退出组、或掉线时,OMCS服务器会将该用户从对应的组中移除。

(3)当某个组中的最后一个人退出时,OMCS服务器会销毁这个组。

  在服务端,这一切都是自动完成的,我们不需要额外编写代码。

二、OMCS.Passive.MultiChat 命名空间

  在客户端,OMCS.Passive.MultiChat命名空间提供:IChatGroupEntrance接口、IChatGroup接口、IChatUnit类,通过这三个元素,我们便可以使用OMCS提供的对多人语音/视频聊天组的功能了。

1

IChatGroupEntrance

  IChatGroupEntrance 是客户端使用多人语音/视频组的入口。

c语言聊天神器(实现多人语音聊天)(1)

 OMCS将语音聊天组和视频聊天组是分开管理的,它们使用ChatType枚举来进行区分:

c语言聊天神器(实现多人语音聊天)(2)

(1)我们可以通过OMCS客户端的核心组件 -- 多媒体管理器IMultimediaManager的ChatGroupEntrance属性获取到聊天组入口的引用。 

(2)当调用IChatGroupEntrance 的Join方法加入某个聊天组,方法会返回一个IChatGroup引用,它代表了目标聊天组。

(3)语音聊天组和视频聊天组的ID可以相同,但是由于它们的类型(ChatType)不同,所以,它们仍然是不同的两个组。

(4)当调用Exit方法主动退出聊天组时,OMCS内部会自动释放该组内部持有的所有多媒体连接器实例(这些连接器实例位于即将介绍的IChatUnit内)。

2

IChatGroup

  IChatGroup封装了一个聊天组的相关信息,其定义如下:

c语言聊天神器(实现多人语音聊天)(3)

(1)当有人加入或退出当前组时,IChatGroup会自动触发SomeoneJoin、SomeoneExit事件。

(2)GetOtherMembers方法将返回组内其它成员的信息,每个成员都对应着一个IChatUnit实例。

3

IChatUnit

  IChatUnit 主要是封装了与目标组成员相关的麦克风连接器、摄像头连接器。

c语言聊天神器(实现多人语音聊天)(4)

(1)特别注意:在通过IChatGroup获取到的IChatUnit时,其DynamicCameraConnector和MicrophoneConnector属性所代表的摄像头连接器及麦克风连接器都还没有与目标设备建立联系。

   我们需要手动调用其BeginConnect方法,连接到该聊天成员的摄像头和麦克风设备。

同时,我们也可以预定其DynamicCameraConnector和MicrophoneConnector的种种事件和查看其种种属性,就像我们使用自己new的连接器组件一样。

   而事实上也是:IChatUnit 仅仅是帮我们实例化了一下连接器组件而已,除此以外再没有做其它的任何动作。

(2)当组成员退出组或者掉线时,OMCS会自动断开IChatUnit中的连接器到目标设备的连接,并且将Valid属性设置为false。

三、如何使用

  假设我们要开发一个视频会议的系统,在这个系统中,登录的用户可以输入一个视频会议房间的RoomID,便可以加入该视频会议。那么,实现的步骤大致如下:

1. 初始化多媒体管理器IMultimediaManager。

2. 调用IMultimediaManager的IChatGroupEntrance属性的Join方法,把RoomID传进去。便会返回一个IChatGroup引用。

3. 遍历IChatGroup的GetOtherMembers方法返回的集合中的每个IChatUnit:

(1)为之创建一个UI控件,绑定到ChatUnit的DynamicCameraConnector,以显示成员的视频。

(2)预定IChatUnit的DynamicCameraConnector和MicrophoneConnector的相关事件,以获取所需的通知。

(3)调用IChatUnit的DynamicCameraConnector和MicrophoneConnector的BeginConnect方法,与该成员的设备进行连接。

4. 预定IChatGroup的SomeoneJoin、SomeoneExit事件。

(1)处理SomeoneJoin事件时,可与第3点一样。

(2)处理SomeoneExit事件时,只需在UI上将退出的成员对应的视频显示控件移除掉。

5. 当自己要退出视频会议时,调用IMultimediaManager的IChatGroupEntrance属性的Exit方法即可。

四、扩展

  OMCS内置的使用“动态组”模式对语音视/频聊天组的支持,只是最核心的支持,它仅仅封装了最纯粹的逻辑。如果需要实现更复杂的自定义业务逻辑,那就需要基于OMCS做更多的开发。

  继续上面的例子,我们假设加入视频会议之前,需要先提交一个申请,在管理员批准之后,才能正式加入到视频会议中。那么类似这样的业务需求单靠OMCS提供的API是无法实现的。

  那么怎么做?

  我们可以在外围利用类似 ESFramework 等通信技术实现这一业务逻辑,具体步骤可参考如下:

(1)当用户输入了视频会议的房间号,并点击“申请加入”按钮时,客户端通过ESFramework发一条消息给在线的该视频会议的管理员。

(2)管理员所在的客户端收到请求消息后,在UI上弹出一个询问框,管理员点击“同意”按钮时,当前客户端就发送一条回复消息给申请的用户。

(3)申请的用户收到同意的回复后,就可以调用IMultimediaManager的IChatGroupEntrance属性的Join方法,来继续第三点中叙述的流程了。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页