
在上一篇文章中,为了实现一个简单的语音(语音聊天系统),我使用C#实现了一个简单的语音,并提供了源代码下载. 尽管有源代码同时语音聊天,但许多朋友报告说它仍然含糊不清. 现在,我想考虑一下,因为我忘了先介绍基本原理. 语音基于OMCS,因此在这里我将对与语音和视频相关的OMCS的原理和解决方案进行介绍.
OMCS使用“动态组”模式来实现语音/视频聊天组. 所谓的“动态组”是在执行期间动态创建和销毁的组. 例如,它包括以下几层含义:
(1)当用户想要添加不存在的动态组时,OMCSserver将首先主动创建该组,然后将用户放入该组.
(2)当用户离开组或脱机时,OMCSserver将从相应的组中删除该用户.
(3)当组中的最后一个人退出时,OMCSserver将销毁该组.
在服务器端,所有这些都是我们主动完成的,我们不需要编写其他代码.
在客户端中,OMCS.Passive.MultiChat命名空间提供: IChatGroupEntrance接口,IChatGroup接口,IChatUnit类. 通过这三个要素,我们可以使用OMCS提供的语音/视频聊天组功能.
IChatGroupEntrance是客户使用语音/视频组的入口.

/// <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的各种属性,就像我们使用新的连接器组件一样.
实际上: 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方法以继续第三点中描述的过程.
好的,这里是OMCS中语音和视频支持的介绍. 现在,让我们看一个简单的语音(语音聊天系统)的源代码,它应该很容易理解. ,
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-215436-1.html
我怎么感觉你是来秀优越感的呢
维持在中东的强大军事存在
难道那个3年没变样的月饼很好吗
爱你不后悔