循序漸進做項目系列(4)迷你QQ篇(2)——視頻聊天!(附源碼)


一·效果展示

       

      源碼派送MiniQQ1.1

      文字聊天的實現參見:循序漸進做項目系列(3):迷你QQ篇(1)——實現客戶端互相聊天

二·服務端設計

      對於實現視頻聊天而言,服務端最核心的工作就是要構造多媒體服務器MultimediaServer 。

namespace Server
{
    static class Program
    {       
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //創建服務端通信引擎
            IRapidServerEngine ServerEngine = RapidEngineFactory.CreateServerEngine();
            ServerHandler serverHandler = new ServerHandler();//創建服務端消息處理器
            //初始化服務端引擎,設置好用於監聽的端口號,並注入消息處理器
            ServerEngine.Initialize(2000/*端口號*/, serverHandler);
            
            DefaultUserVerifier userVerifier = new DefaultUserVerifier();//默認任何用戶都驗證通過
            //OMCS配置信息
            OMCSConfiguration config = new OMCSConfiguration(15/*攝像頭采集的幀頻*/,
                                                             15/*遠程桌面的幀頻*/,
                                                             EncodingQuality.Middle/*語音編碼的質量*/);
            //創建多媒體服務器
            IMultimediaServer MultimediaServer = MultimediaServerFactory.CreateMultimediaServer(2400/*監聽的端口*/,
                                                                                                userVerifier/*用戶帳密驗證器*/,
                                                                                                config/*OMCS配置信息*/,
                                                                                                false/*是否記錄詳細的安全日志*/);                       
            Application.Run(new Form_Server());
          
        }
    }
}

三·客戶端設計

      對於實現視頻聊天而言,客戶端設計的核心在於需要構造並初始化多媒體設備管理器 multimediaManager

    1.登陸窗設計

      對於實現視頻聊天而言,登陸窗的主要任務就是與多媒體服務器MultimediaServer 建立連接,並初始化本地多媒體管理器multimediaManager。      

namespace Client
{
    public partial class Form_Login : Form
    {
        private IRapidPassiveEngine clientEngine;//客戶端通信引擎 
       
        private  ClientHandler clientHandler;//客戶端消息處理器

        public string SelfUserID//本人用戶ID,該屬性主要是為了暴露給主窗體用來標識用戶
        {            
            get { return this.textBox_UserID.Text; }
        }

        public Form_Login(IRapidPassiveEngine _clientEngine, ClientHandler _clientHandler)
        {
            InitializeComponent();
            //傳入通信引擎和消息處理器主要是為了登陸的時候進行通信引擎初始化操作
            this.clientEngine = _clientEngine;
            this.clientHandler = _clientHandler;           
        }

        private void button_login_Click(object sender, EventArgs e)
        {
            //通信引擎初始化,與目標服務器建立TCP連接             
            LogonResponse logonResponse = this.clientEngine.Initialize(this.textBox_UserID.Text, this.textBox_Password.Text, "127.0.0.1", 2000, clientHandler);
            //創建多媒體設備管理器
            IMultimediaManager multimediaManager = MultimediaManagerFactory.GetSingleton();
            multimediaManager.CameraDeviceIndex = 1;//要使用的攝像頭的索引
            multimediaManager.AutoAdjustCameraEncodeQuality = false;//是否根據音頻反饋以及視頻丟幀情況自動調整視頻編碼質量
            //與多媒體服務器建立連接,並初始化本地多媒體管理器。
            multimediaManager.Initialize(this.textBox_UserID.Text,/*當前登錄的用戶ID*/
                                         null,/*當前登錄的用戶的密碼*/
                                        "127.0.0.1",/*OMCS服務器IP*/
                                         2400);/*OMCS服務器端口*/
            if (logonResponse.LogonResult == LogonResult.Succeed)
            {
                this.DialogResult = DialogResult.OK;
            }
            else
            {
                MessageBox.Show("登陸失敗!" + logonResponse.LogonResult.ToString() + logonResponse.FailureCause);
            }
        }         
    }
}

    2.主窗體設計

      對於實現視頻聊天而言,主窗體最主要的工作就是開啟視頻窗。

namespace Client
{
    public partial class Form_Client : Form
    {
        private IRapidPassiveEngine clientEngine;

        private string selfUserID;
        private string targetUserID;

        public Form_Client(IRapidPassiveEngine _clientEngine,string _selfUserID)
        {
            this.clientEngine = _clientEngine;
            this.selfUserID = _selfUserID;
            this.Text = _selfUserID;//在窗體上顯示本用戶ID             
            InitializeComponent();
        }

        private void button_Send_Click(object sender, EventArgs e)
        {
            string msg = this.textBox_Input.Text;//聊天消息
            Byte[] msgCode = Encoding.UTF8.GetBytes(msg);//轉碼以備發送
           //從輸入框讀取待發送用戶ID
            //利用通信引擎發送消息
            this.clientEngine.CustomizeOutter.Send(this.targetUserID, InformationType.Chat, msgCode);
            this.ShowChatMsg(this.selfUserID, msg);         
        }
        //將聊天消息按一定格式顯示在界面上
        public void ShowChatMsg(string UserID, string msg)
        {
            this.richTextBox_Output.AppendText(UserID + "  " + DateTime.Now.ToString() + "\n");
            this.richTextBox_Output.AppendText(msg + "\n");
            this.richTextBox_Output.ScrollToCaret();
            this.textBox_Input.Text = "";
        }
        //開啟視頻
        private void button_Video_Click(object sender, EventArgs e)
        {
            this.targetUserID = this.textBox_TargetUserID.Text;
            Form_Video form_Video = new Form_Video(this.targetUserID/*待連接用戶ID*/);//創建視頻窗
            form_Video.Show();//顯示視頻窗
        }
    }
}

    3.視頻窗設計

       對於實現視頻聊天而言,視頻窗最主要的任務就是將視頻連接器cameraConnector連接到目標用戶的攝像頭

namespace Client
{
    public partial class Form_Video : Form
    {
        public Form_Video(string targetUserID)
        {
            InitializeComponent();
            //預定攝像頭連接器的連接結束和連接斷開事件             
            this.cameraConnector.ConnectEnded += new ESBasic.CbGeneric<OMCS.Passive.ConnectResult>(cameraConnector_ConnectEnded);
            this.cameraConnector.Disconnected += new ESBasic.CbGeneric<OMCS.Passive.ConnectorDisconnectedType>(cameraConnector_Disconnected);
            this.cameraConnector.BeginConnect(targetUserID/*待連接用戶ID*/);//嘗試連接目標多媒體設備           
        }

        void cameraConnector_Disconnected(OMCS.Passive.ConnectorDisconnectedType connectorDisconnectedType)
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new CbGeneric<ConnectorDisconnectedType>(this.cameraConnector_Disconnected), connectorDisconnectedType);
            }
            else
            {
                this.Text = string.Format("視頻:斷開,{0}", connectorDisconnectedType);
                if (connectorDisconnectedType == ConnectorDisconnectedType.TrialTimeout)
                {
                    MessageBox.Show("Trial Timeout");
                }
            }
        }

        void cameraConnector_ConnectEnded(ConnectResult result)
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new CbGeneric<ConnectResult>(this.cameraConnector_ConnectEnded), result);
            }
            else
            {
                //顯示視頻連接結果
                this.Text = string.Format("視頻:{0}", result == ConnectResult.Succeed ? "正常" : result.ToString());
            }
        }

        //關閉窗口時,主動斷開連接,並釋放連接器
        private void Form_Video_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.cameraConnector.Disconnect();//與目標用戶的多媒體設備斷開連接
            this.cameraConnector.Dispose(); //釋放資源        
        }     
    }
}

四·源碼下載

      MiniQQ1.1

    本Demo僅僅實現了客戶端互相打視頻,更多更豐富的功能將在高版本中逐步為大家展示,歡迎大家持續關注哦!

    如果您覺得對您有點幫助的話請點個贊吧!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM