C#实现多人语音聊天

在上一篇文章 实现一个简单的语音聊天室(多人语音聊天系统)中,我用C#实现了一个简单的语音聊天室,并给出了源码下载。虽然有源码,但是很多朋友反映,理解起来还是有些模糊、不够清楚。现在想来,是因为我忘了先将底层的原理介绍一下,语音聊天室是基于OMCS实现的,那么这里我就补上OMCS中与多人语音视频相关部分的原理及方案的介绍。

一. 动态组  

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

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

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

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

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

二. OMCS.Passive.MultiChat 命名空间

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

1. IChatGroupEntrance

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

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

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

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

2. IChatGroup

  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实例。

3.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)当用户输入了视频会议的房间号,并点击“申请加入”按钮时,客户端通过ESFramework发一条消息给在线的该视频会议的管理员。

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

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

OK,OMCS中对多人语音视频支持的部分介绍就到这里,大家现在再来看实现一个简单的语音聊天室(多人语音聊天系统)的源码,应该就很容易理解了。,

时间: 2024-10-26 16:03:25

C#实现多人语音聊天的相关文章

实现一个简单的语音聊天室(多人语音聊天系统)

多人语音聊天,或语音聊天室,是即时通信应用中常见的功能之中的一个,比方,QQ的语音讨论组就是我们用得比較多的. 本文将基于最新版本号的OMCS(V3.5)实现一个简单的语音聊天室,让多个人能够进入同一个房间进行语音沟通.当然,在此之前,您必须对OMCS有所了解,而且已经阅读.理解了OMCS 开发手冊(08) -- 多人语音/视频这篇文章的内容.先看看Demo执行效果截图:        从左到右的三张图各自是:登录界面.语音聊天室的主界面.标注了各个控件的主界面. 一. C/S结构 非常明显,我

实现一个简单的语音聊天室(源码)

语音聊天室,或多人语音聊天,是即时通信应用中常见的功能之一,比如,QQ的语音讨论组就是我们用得比较多的. 这篇文章将实现一个简单的语音聊天室,让多个人可以进入同一个房间进行语音沟通.先看运行效果截图:         从左到右的三张图分别是:登录界面.语音聊天室的主界面.标注了各个控件的主界面. (如果觉得界面太丑,没关系,后面下载源码后,你可以自己美化~~) 一. C/S结构 很明显,我这个语音聊天室采用的是C/S结构,整个项目结构相对比较简单,如下所示: 该项目的底层是基于OMCS构建的.这

C#实现多人视频聊天

在 <C#实现多人语音聊天>一文发布后,很多朋友建议我也实现一个视频聊天室给他们参考一下,其实,视频聊天室与语音聊天室的原理是差不多的,由于加入了摄像头.视频的处理,逻辑会繁杂一些,本文就实现一个简单的多人视频聊天系统,让多个人可以进入同一个房间进行语音视频沟通.先看看3个人进行视频聊天的运行效果截图:       上面两张截图分别是:登录界面.标注了各个控件的视频聊天室的主界面. 一. C/S结构 很明显,我这个语音聊天室采用的是C/S结构,整个项目结构相对比较简单,如下所示: 同语音聊天室

多人语音直播系统开发中聊天室功能实现方案?

"直播+"不仅是视频.直播平台的尝试方向,也成为众多音乐平台的创新业务,而语音直播正是其中一种尝试.语音直播的用户更偏向年轻化,多为追求新鲜感的90后群体,他们有自己的行为处事方式,喜欢把孤独和无聊的时间用声音的方式宣泄.对于喜爱声音的这类群体来说,语音直播系统开发既保护了他们的隐私又让他们倍感亲切.那么从技术层面讲,多人语音直播系统开发中聊天室的功能实现需要特别注意哪些呢?一.语音直播系统开发的优势是什么?想必有人会问语音直播和传统的电台有什么不同呢?语音直播也有着自己的优势主要有以

微信2.1 for Windows发布 微信群可多人语音或视频通话

5月31日,windows电脑版微信发布更新,微信2.1 for Windows带来最主要的功能是微信群可以多人语音或视频通话了,建个家庭群组,常年在外工作的家人也可以每天见面了,多亲切! 除了可以建立多人语音聊天外,还全新设计了聊天消息气泡.发送文件大小从25M提高到100M.优化内置浏览器,提升浏览体验. 小伙伴们赶紧去体验吧

树莓派-语音聊天机器人+语音控制引脚电平高低

最近和几位本学院的研究生师兄师姐参加研究生电子设计大赛,自己也来折腾下之前没有搞完的语音控制小车.恰巧自己负责的是语音控制这部分,折腾了几天也差不多搞定啦…把自己的折腾套路总结一下,给一起折腾的小伙伴点经验之谈… 一.配置树莓派 我们这次使用的最新的树莓派3,镜像直接是官网下载的Raspbian.这也是让我感觉最有树莓派感觉的一个系统.主要是sudo raspi-config的配置. 1和2最好都是设置一下,然后3看自己爱好吧:4的里面我都是重新设置的,包括时区.语言和字体.字体最好下载(apt

如何优雅的用Python玩转语音聊天机器人

一名极客运维人员,走在脑洞大开的路上.... Python聊天机器人:可以感应人是否存在,识别语音,通过图灵API语音回答 -------------------------上图镇楼---------------------------- [详细攻略] 所需硬件: 树莓派B+ 人体红外线感应模块 内置麦克风摄像头(实测树莓派免驱淘宝链接) 申请API: 百度语音api 图灵api 语音聊天机器人实现原理:当有人来到跟前时-->触发聊天功能,开始以每2s检测录制语音-->通过百度语音api合成文

unity语音聊天--亲加通讯云(Android/iOS)---android

注:最近项目需求要做语音聊天这一块的功能,想了几种方案,最后还是决定用第三方服务,毕竟日活50W以下亲加是免费的! 亲加官方给了一定的技术文档,但是遇到很多坑,我顺便都介绍一下 废话不多说,先介绍Android接入,下一章介绍iOS. 1.下载开发包 亲加开发包下载地址 http://www.gotye.com.cn/download.html 即时通讯云包含丰富的聊天功能接口,不用语音通讯云了,下这个开发包 Android开发的朋友们下android的包,android的接入官方文档很详细,而

微信语音聊天内容怎么录制 如何录制通话记录

微信的注册用户已破十亿,这一庞大的数字代表着其在人们生活和工作中的地位之重,使用微信一般都是用来交流聊天,但是现在随着电子商务的日益发展,微商也在日益壮大,最经常使用的功能还是聊天通话,那对于重要的通话记录很多人都会选择录制下来,可是发现无法录制,那怎么样录制微信语音聊天内容呢? 1.首先需要在电脑上登录自己的微信账号,因为目前对于手机来说还是无法实现在线录制的,所以需要电脑端实现在线录制微信聊天内容:2.在电脑上运行一个第三方音频录制工具--迅捷录音软件,用于辅助录制聊天内容,即在线录制音频,