在上一篇文章 实现一个简单的语音聊天室(多人语音聊天系统)中,我用C#实现了一个简单的语音聊天室,并给出了源代码下载。尽管有源代码,但是很是多朋友反映,理解起来仍是有些模糊、不够清楚。现在想来,是因为我忘了先将底层的原理介绍一下,语音聊天室是基于OMCS实现的,那么这里我就补上OMCS中与多人语音视频相关部分的原理及方案的介绍。 ide
OMCS採用“动态组”的模式来实现多人语音/视频聊天组,所谓“动态组”,就是在执行时动态建立和销毁的组,其包括例如如下几层意思:spa
(1)当某个用户要增长一个不存在的动态组时,OMCSserver会首先本身主动建立这个组,而后,再把用户放进这个组。.net
(2)当用户退出组、或掉线时,OMCSserver会将该用户从相应的组中移除。code
(3)当某个组中的最后一我的退出时,OMCSserver会销毁这个组。视频
在服务端,这一切都是本身主动完毕的,咱们不需要额外编写代码。server
在client,OMCS.Passive.MultiChat命名空间提供:IChatGroupEntrance接口、IChatGroup接口、IChatUnit类,经过这三个元素,咱们便可以使用OMCS提供的对多人语音/视频聊天组的功能了。blog
IChatGroupEntrance 是client使用多人语音/视频组的入口。接口
/// <summary> /// 语音视频聊天组入口。 /// </summary> public interface IChatGroupEntrance { /// <summary> /// 增长某个聊天组。假设目标组不存在,将本身主动建立目标组。 /// </summary> /// <param name="chatType">聊天组的类型。</param> /// <param name="chatGroupID">目标组ID。</param> IChatGroup Join(ChatType chatType ,string chatGroupID); /// <summary> /// 离开聊天组。假设掉线,也会本身主动从聊天组中退出。 /// </summary> /// <param name="chatType">聊天组的类型。</param> /// <param name="chatGroupID">目标组ID。</param> void Exit(ChatType chatType, string chatGroupID); }
OMCS将语音聊天组和视频聊天组是分开管理的,它们使用ChatType枚举来进行区分:事件
/// <summary> /// 聊天组的类型。 /// </summary> public enum ChatType { /// <summary> /// 语音聊天组。 /// </summary> Audio = 0, /// <summary> /// 视频聊天组。 /// </summary> Video }
(1)咱们可以经过OMCSclient的核心组件 -- 多媒体管理器IMultimediaManager的ChatGroupEntrance属性获取到聊天组入口的引用。 开发
(2)当调用IChatGroupEntrance 的Join方法增长某个聊天组,方法会返回一个IChatGroup引用,它表明了目标聊天组。
(3)语音聊天组和视频聊天组的ID可以一样,但是由于它们的类型(ChatType)不一样,因此,它们仍然是不一样的两个组。
(4)当调用Exit方法主动退出聊天组时,OMCS内部会本身主动释放该组内部持有的所有多媒体链接器实例(这些链接器实例位于即将介绍的IChatUnit内)。
IChatGroup封装了一个聊天组的相关信息,其定义例如如下:
/// <summary> /// 封装一个聊天组的信息。 /// </summary> public interface IChatGroup { /// <summary> /// 当有新成员增长聊天组时,将触发此事件。 /// </summary> event CbGeneric<IChatUnit> SomeoneJoin; /// <summary> /// 当某成员掉线或离开聊天组时,触发此事件。 /// </summary> event CbGeneric<string> SomeoneExit; /// <summary> /// 聊天组的ID。 /// </summary> string GroupID { get; } /// <summary> /// 聊天组的类型。假设为语音聊天,则DynamicCameraConnector为null。 /// </summary> ChatType ChatType { get; } /// <summary> /// 获取组成员的信息。 /// </summary> IChatUnit GetMember(string memberID); /// <summary> /// 获取组内除本身以外的其余成员的信息。 /// </summary> List<IChatUnit> GetOtherMembers(); }
(1)当有人增长或退出当前组时,IChatGroup会本身主动触发SomeoneJoin、SomeoneExit事件。
(2)GetOtherMembers方法将返回组内其余成员的信息,每个成员都相应着一个IChatUnit实例。
IChatUnit 主要是封装了与目标组成员相关的麦克风链接器、摄像头链接器。
/// <summary> /// 用于封装聊天组一个成员的相关信息的单元。 /// </summary> public interface IChatUnit { /// <summary> /// 相应的组成员的ID。 /// </summary> string MemberID { get; } /// <summary> /// 是否有效?假设相应的组成员退出组或者掉线,则将返回false。 /// </summary> bool Valid { get; } /// <summary> /// 摄像头链接器。(可将其链接到相应组成员的摄像头)。假设为语音聊天,则DynamicCameraConnector为null。 /// </summary> DynamicCameraConnector DynamicCameraConnector { get; } /// <summary> /// 麦克风链接器。(可将其链接到相应组成员的麦克风) /// </summary> MicrophoneConnector MicrophoneConnector { get; } }
(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)当用户输入了视频会议的房间号,并点击“申请增长”button时,client经过ESFramework发一条消息给在线的该视频会议的管理员。
(2)管理员所在的client收到请求消息后,在UI上弹出一个询问框,管理员点击“容许”button时,当前client就发送一条回复消息给申请的用户。
(3)申请的用户收到容许的回复后,就可以调用IMultimediaManager的IChatGroupEntrance属性的Join方法,来继续第三点中叙述的流程了。
OK,OMCS中对多人语音视频支持的部分介绍就到这里,你们现在再来看实现一个简单的语音聊天室(多人语音聊天系统)的源代码,应该就很是easy理解了。,