C#實現多人語音聊天

在上一篇文章 實現一個簡單的語音聊天室(多人語音聊天系統)中,我用C#實現了一個簡單的語音聊天室,並給出了源代碼下載。儘管有源代碼,但是很是多朋友反映,理解起來仍是有些模糊、不夠清楚。現在想來,是因爲我忘了先將底層的原理介紹一下,語音聊天室是基於OMCS實現的,那麼這裏我就補上OMCS中與多人語音視頻相關部分的原理及方案的介紹。 ide

一. 動態組  

  OMCS採用「動態組」的模式來實現多人語音/視頻聊天組,所謂「動態組」,就是在執行時動態建立和銷燬的組,其包括例如如下幾層意思:spa

(1)當某個用戶要增長一個不存在的動態組時,OMCSserver會首先本身主動建立這個組,而後,再把用戶放進這個組。.net

(2)當用戶退出組、或掉線時,OMCSserver會將該用戶從相應的組中移除。code

(3)當某個組中的最後一我的退出時,OMCSserver會銷燬這個組。視頻

  在服務端,這一切都是本身主動完畢的,咱們不需要額外編寫代碼。server

 

二. OMCS.Passive.MultiChat 命名空間

  在client,OMCS.Passive.MultiChat命名空間提供:IChatGroupEntrance接口、IChatGroup接口、IChatUnit類,經過這三個元素,咱們便可以使用OMCS提供的對多人語音/視頻聊天組的功能了。blog

1. IChatGroupEntrance

  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的核心組件 -- 多媒體管理器IMultimediaManagerChatGroupEntrance屬性獲取到聊天組入口的引用。 開發

(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)當用戶輸入了視頻會議的房間號,並點擊「申請增長」button時,client經過ESFramework發一條消息給在線的該視頻會議的管理員。

(2)管理員所在的client收到請求消息後,在UI上彈出一個詢問框,管理員點擊「容許」button時,當前client就發送一條回覆消息給申請的用戶。

(3)申請的用戶收到容許的回覆後,就可以調用IMultimediaManager的IChatGroupEntrance屬性的Join方法,來繼續第三點中敘述的流程了。


OK,OMCS中對多人語音視頻支持的部分介紹就到這裏,你們現在再來看實現一個簡單的語音聊天室(多人語音聊天系統)的源代碼,應該就很是easy理解了。,

相關文章
相關標籤/搜索