C#实现语音聊天

电脑杂谈  发布时间:2020-05-19 15:04:10  来源:网络整理

同时语音聊天_qq聊天不能语音_yy聊天怎么发语音

在上一篇文章中,为了实现一个简单的语音(语音聊天系统),我使用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); 
    }

同时语音聊天_qq聊天不能语音_yy聊天怎么发语音

复制代码

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封装了聊天组的相关信息,其定义如下:

同时语音聊天_qq聊天不能语音_yy聊天怎么发语音

复制代码

    /// <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属性表示的连接器和麦克风连接器尚未与目标设备建立联系.

同时语音聊天_yy聊天怎么发语音_qq聊天不能语音

我们需要手动调用其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的相关事件以获取所需的通知.

qq聊天不能语音_同时语音聊天_yy聊天怎么发语音

(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年没变样的月饼很好吗

      热点图片
      拼命载入中...