实例介绍
【实例简介】
1、实现双向视频通话,VS2008工程,编译直接运行即可;
2、可执行程序在:client\bin\x86\Debug目录下;
3、自己部署服务器,直接运行:server\run.bat,在电脑右下角托盘区域会出现运行图标;
4、编解码部分用了第三方的库,效果不错,画面清晰,实时性非常好;
1、实现双向视频通话,VS2008工程,编译直接运行即可;
2、可执行程序在:client\bin\x86\Debug目录下;
3、自己部署服务器,直接运行:server\run.bat,在电脑右下角托盘区域会出现运行图标;
4、编解码部分用了第三方的库,效果不错,画面清晰,实时性非常好;
【实例截图】
【核心代码】
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices;//DLLImport using System.IO; using ANYCHATAPI; namespace AnyChatCSharpDemo { public partial class frmRoom : Form { #region 定义窗体委托 delegate void AsyncTransFileStatus(int m_UserID, int m_TaskID); delegate void AsyncTransSetFileProgress(string m_Progress); #endregion #region 定义控件 //用户视频信息提示Label Label lbl_user = new System.Windows.Forms.Label(); #endregion #region 文件传输变量定义 int m_ReceiveUserID = -1; int m_ReceiveTaskID = -1; #endregion #region 调用WIN的API /// <summary> /// 调节声音大小 /// </summary> /// <param name="deviceID"></param> /// <param name="Volume"></param> /// <returns></returns> [DllImport("winmm.dll", EntryPoint = "waveOutSetVolume", CharSet = CharSet.Auto)] public static extern long waveOutSetVolume(long deviceID, long Volume); #endregion #region 窗体信息定义 /// <summary> /// 字体名称 /// </summary> public string[] m_AllFontSizeName ={ "8", "9", "10", "12", "14", "16", "18", "20", "22", "24", "26", "28", "36", "48", "72", "初号", "小初", "一号", "小一", "二号", "小二", "三号", "小三", "四号", "小四", "五号", "小五", "六号", "小六", "七号", "八号" }; /// <summary> /// 字号 /// </summary> public float[] m_AllFontSize ={ 8, 9, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72, 42, 36, 26, 24, 22, 18, 16, 15, 14, 12, 10.5F, 9, 7.5F, 6.5F, 5.5F, 5 }; //1=160*120;2=176*144; 3=320*240; 4=352*288; 5=528*384; 6=640*480; 7=704*576 /// <summary> /// 视频放大宽度 /// </summary> private int m_VideoWidthMax = 480; /// <summary> /// 视频放大高度 /// </summary> private int m_VideoHeightMax = 384; /// <summary> /// 本地视频状态,true为发送本地视频,false为不发送 /// </summary> private bool m_LocalVideoStatue = true; /// <summary> /// 本地音频状态,true为发送本地音频,false为不发送 /// </summary> private bool m_LocalAudioStatue = true; #endregion #region 房间信息定义 /// <summary> /// 几列视频窗口(横着几个视频窗口) /// </summary> private int m_ColUserVideo = 3; /// <summary> /// 房间ID /// </summary> private int m_RoomID = 1; /// <summary> /// 用户ID(系统自动分配) /// </summary> private int m_myUserID = -1; /// <summary> /// 房间用户列表(不包括自己),开发包自带 /// </summary> private List<int> m_others = new List<int>(); /// <summary> /// 用户列表(包含用户结构属性) /// </summary> private List<clsMemberList.MemberItem> m_MemberItem=new List<clsMemberList.MemberItem>(); #endregion #region 构造函数 public frmRoom() { InitializeComponent(); } #endregion #region 初始化房间 void InitChat() { string path = Application.StartupPath; SystemSetting.Text_OnReceive = new TextReceivedHandler(Received_Text);//文本回调涵数 SystemSetting.TransBuffer_OnReceive = new TransBufferReceivedHandler(Received_TransBuffer);//透明通道传输回调 SystemSetting.TransFile_OnReceive = new TransFileReceivedHandler(Received_TransFile);//文件传输回调 AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_CORESDK_PATH, path, path.Length); SystemSetting.Init(this.Handle); ////设置视频分辨率 //int m_Refw = AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_WIDTHCTRL, ref frmLogin.m_LocalVideoWidth, sizeof(int)); //int m_Refh = AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_HEIGHTCTRL, ref frmLogin.m_LocalVideoHeight, sizeof(int)); ////应用本地视频编码参数,使得前述修改即时生效(参数为int型:1 使用新参数,0 使用默认参数) //int m_AppLocal = 1; //AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_APPLYPARAM, ref m_AppLocal, sizeof(int)); //StringBuilder m_ServerKey = new StringBuilder(); //m_ServerKey.Append("d"); //int retkey = AnyChatCoreSDK.SetServerAuthPass(m_ServerKey); int ret = AnyChatCoreSDK.Connect(frmLogin.m_VideoServerIP, frmLogin.m_VideoTcpPort); ret = AnyChatCoreSDK.Login(frmLogin.m_UserName, "", 0); } #endregion #region 文件传输 #region 显示文件传输状态 private void Receive_GransFileStatus(int m_UserID, int m_TaskID) { m_ReceiveUserID = m_UserID; m_ReceiveTaskID = m_TaskID; //MessageBox.Show("U:" m_ReceiveUserID.ToString() "T:" m_ReceiveTaskID.ToString()); //txt_2.BeginInvoke(new AsyncTransSetFileProgress(SetTxtValue), m_ReceiveUserID.ToString() ":" m_ReceiveTaskID.ToString()); } #endregion #region 每秒更新文件进度 private void tmr_receivefile_Tick(object sender, EventArgs e) { //每秒更新视频码率 int m_AVInfoval = 0; int avret = AnyChatCoreSDK.QueryUserState(-1, AnyChatCoreSDK.BRAC_USERSTATE_VIDEOBITRATE, ref m_AVInfoval, sizeof(int)); string m_AVSpeed = m_AVInfoval.ToString() "B/S"; if (m_AVInfoval > 1000) { try { double m_AVTemp = (double)m_AVInfoval / 1000.0; m_AVSpeed = m_AVTemp.ToString(); m_AVSpeed = m_AVSpeed.Substring(0, m_AVSpeed.Length - 2) "KB/S"; } catch { } } lbl_v_speed.BeginInvoke(new AsyncTransSetFileProgress(SetVideoSpeed), m_AVSpeed); //每秒更新音频码率 avret = AnyChatCoreSDK.QueryUserState(-1, AnyChatCoreSDK.BRAC_USERSTATE_AUDIOBITRATE, ref m_AVInfoval, sizeof(int)); m_AVSpeed = m_AVInfoval.ToString() "B/S"; if (m_AVInfoval > 1000) { try { double m_AVTemp = (double)m_AVInfoval / 1000.0; m_AVSpeed = m_AVTemp.ToString(); m_AVSpeed = m_AVSpeed.Substring(0, m_AVSpeed.Length - 2) "KB/S"; } catch { } } lbl_a_speed.BeginInvoke(new AsyncTransSetFileProgress(SetAudioSpeed), m_AVSpeed); //StringBuilder m_InfoVal = new StringBuilder(300); //int ret = AnyChatCoreSDK.QueryTransTaskInfo(m_ReceiveUserID, m_ReceiveTaskID, 1, m_InfoVal, 300); //double m_InfoVal = 0.0; //int ret = AnyChatCoreSDK.QueryTransTaskInfo(m_ReceiveUserID, m_ReceiveTaskID, 1, ref m_InfoVal, 300); //lbl_progress.BeginInvoke(new AsyncTransSetFileProgress(SetTransFileProgress), ret.ToString() ":" m_InfoVal.ToString()); //int m_InfoVal = 0; double m_InfoVal = 0.0; int ret = AnyChatCoreSDK.QueryTransTaskInfo(m_ReceiveUserID, m_ReceiveTaskID, 1, ref m_InfoVal, sizeof(double)); if(ret != 0) return; string m_BFB = m_InfoVal.ToString(); try { m_BFB = m_BFB.Substring(0, m_BFB.IndexOf(".") 3); } catch { } m_BFB = "%"; lbl_progress.BeginInvoke(new AsyncTransSetFileProgress(SetTransFileProgress), "进度:" m_BFB); int m_InfoValSpeed = 1; int rett = AnyChatCoreSDK.QueryTransTaskInfo(m_ReceiveUserID, m_ReceiveTaskID, 2, ref m_InfoValSpeed, sizeof(int)); string m_VSpeed = ""; double m_Templv = 0.0; m_VSpeed = m_InfoValSpeed.ToString() "B/S"; if (m_InfoValSpeed > 1000) { m_Templv = (double)m_InfoValSpeed / 1000.0; m_VSpeed = m_Templv.ToString(); try { m_VSpeed = m_VSpeed.Substring(0, m_VSpeed.IndexOf(".") 2); } catch { } m_VSpeed =m_VSpeed "KB/S"; } if (m_InfoValSpeed > 1000000) { m_Templv = (double)m_InfoValSpeed / 1000000.0; m_VSpeed = m_Templv.ToString(); try { m_VSpeed = m_VSpeed.Substring(0, m_VSpeed.IndexOf(".") 2); } catch { } m_VSpeed = m_VSpeed "MB/S"; } lbl_speed.BeginInvoke(new AsyncTransSetFileProgress(SetTransFileSpeed), "速率:" m_VSpeed); } #endregion #region 异步设置文件进度 private void SetTransFileProgress(string m_Progress) { lbl_progress.Text = m_Progress; } private void SetTransFileSpeed(string m_Speed) { lbl_speed.Text = m_Speed; } #endregion #region 异步设置文本框值 private void SetTxtValue(string m_Txt) { //txt_2.Text = m_Txt; } #endregion #region 异步设置视频码率 private void SetVideoSpeed(string m_VSpeed) { lbl_v_speed.Text = "视频码率:" m_VSpeed; } #endregion #region 异步设置音频码率 private void SetAudioSpeed(string m_ASpeed) { lbl_a_speed.Text = "音频码率:" m_ASpeed; } #endregion #endregion #region 显示文本 /// <summary> /// 显示聊天文本 /// </summary> /// <param name="fromUID"></param> /// <param name="toUID"></param> /// <param name="m_Text"></param> /// <param name="isserect"></param> void Received_Text(int fromUID, int toUID, string m_Text, bool isserect) { string m_FromName = GetUserNameByID(fromUID); string m_ToName = GetUserNameByID(toUID); if (toUID == -1) m_ToName = "大家"; string m_DispMsg = m_FromName " To " m_ToName " "; ShowText(m_DispMsg, txt_Accept.TextLength, m_DispMsg.Length, Color.Green, new Font("黑体", 9, FontStyle.Bold)); ShowText(DateTime.Now.ToString(), txt_Accept.TextLength, DateTime.Now.ToString().Length, Color.Green, new Font("黑体", 9, FontStyle.Bold)); ShowText("\r\n", txt_Accept.TextLength, 4, Color.Blue, new Font("宋体", 12)); ShowText(" ", txt_Accept.TextLength, 4, Color.Blue, new Font("宋体", 12)); ShowText(m_Text, txt_Accept.TextLength, m_Text.Length, Color.Black, new Font("黑体", 9)); ShowText("\r\n\r\n", txt_Accept.TextLength, 8, Color.Blue, new Font("宋体", 12)); } /// <summary> /// 显示系统信息 /// </summary> /// <param name="m_Msg"></param> void Print(string m_Msg) { string m_SysInfo = "[系统信息] "; m_Msg = "\r\n\r\n"; ShowText(m_SysInfo, txt_Accept.TextLength, m_SysInfo.Length, Color.Red, new Font("黑体", 9,FontStyle.Bold)); ShowText(m_Msg, txt_Accept.TextLength, m_Msg.Length, Color.Black, new Font("黑体", 9)); } /// <summary> /// 向RichTextBox添加文本 /// </summary> /// <param name="sText"></param> /// <param name="nStart"></param> /// <param name="nLength"></param> /// <param name="color"></param> /// <param name="font"></param> private void ShowText(string sText, int nStart, int nLength, Color color, Font font) { txt_Accept.AppendText(sText); txt_Accept.Select(nStart, nLength); // 需要修改颜色的部分 txt_Accept.SelectionColor = color; // 颜色 txt_Accept.SelectionFont = font; // 字体 txt_Accept.ScrollToCaret(); txt_Accept.Select(txt_Accept.Text.Length, 0); } #endregion #region 重载WndProc protected override void WndProc(ref Message m) { if (m.Msg == AnyChatCoreSDK.WM_GV_CONNECT) { ///连接 int succed = m.WParam.ToInt32(); if (succed == 1) { Print("连接成功!"); } else { Print("连接失败,错误号:" m.LParam.ToInt32()); } } else if (m.Msg == AnyChatCoreSDK.WM_GV_LOGINSYSTEM) { ///登录系统 int userid = m.WParam.ToInt32(); if (m.LParam.ToInt32() == 0) { //Print("登录服务器成功,自己的用户编号为:" userid.ToString()); Print("登录服务器成功,自己的用户账号为:" frmLogin.m_UserName); m_myUserID = userid; StringBuilder userName = new StringBuilder(30); int ret = AnyChatCoreSDK.GetUserName(userid, userName, 30); AnyChatCoreSDK.EnterRoom(m_RoomID, "", 0); } else { Print("登录服务器失败,代码出错为:" m.LParam.ToInt32()); } } else if (m.Msg == AnyChatCoreSDK.WM_GV_ENTERROOM) { ///进入房间 if (m.LParam.ToInt32() == 0) { int roomid = m.WParam.ToInt32(); Print("进入房间成功,房间编号为:" roomid.ToString()); m_RoomID = roomid; int ret = AnyChatCoreSDK.SetVideoPos(-1, pnl_local.Handle, 0, 0, pnl_local.Width, pnl_local.Height); ret = AnyChatCoreSDK.UserCameraControl(-1, true); ret = AnyChatCoreSDK.UserSpeakControl(-1, true); } else { Print("申请进入房间失败,出错代码为:" m.LParam.ToInt32()); } } else if (m.Msg == AnyChatCoreSDK.WM_GV_ONLINEUSER) { ///目前在房间的用户列表 int usrcnt = m.WParam.ToInt32(); Print("在编号为:" m.LParam.ToInt32() " 的房间共有" usrcnt "位在线用户"); Print("当前时间:" DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")); int cnt = 0;//在线用户数量 AnyChatCoreSDK.GetOnlineUser(null, ref cnt);//获取在线用户数量 int[] userArr = new int[cnt];//在线用户ID AnyChatCoreSDK.GetOnlineUser(userArr, ref cnt);//获取在线用户ID数组 if (userArr.Length >= 1) { for (int i = 0; i < userArr.Length; i ) { m_others.Add(userArr[i]);//存入在线用户列表中(开发包带的用户在线ID数组) UpdateUserList(userArr[i], i);//添加到在线用户列表(自定义,带用户属性结构) } UpdateOnlineUser(); } else { dgv_onlineuser.Rows.Clear(); DataGridViewRow dgvr = new DataGridViewRow(); dgv_onlineuser.Rows.Add(dgvr); dgvr = dgv_onlineuser.Rows[dgv_onlineuser.Rows.Count - 1]; dgvr.Cells["gvc_username"].Value = "大家"; dgvr.Cells["gvc_audio"].Value = AnyChatCSharpDemo.Properties.Resources.深灰背景; dgvr.Cells["gvc_video"].Value = AnyChatCSharpDemo.Properties.Resources.深灰背景; dgvr.Cells["gvc_character"].Value = AnyChatCSharpDemo.Properties.Resources.深灰背景; dgvr = new DataGridViewRow(); dgv_onlineuser.Rows.Add(dgvr); dgvr = dgv_onlineuser.Rows[dgv_onlineuser.Rows.Count - 1]; dgvr.Cells["gvc_username"].Value = frmLogin.m_UserName; ; dgvr.Cells["gvc_character"].Value = AnyChatCSharpDemo.Properties.Resources.主持人_浅灰; dgvr.Cells["gvc_audio"].Value = AnyChatCSharpDemo.Properties.Resources.麦克; dgvr.Cells["gvc_video"].Value = AnyChatCSharpDemo.Properties.Resources.摄像头; } } else if (m.Msg == AnyChatCoreSDK.WM_GV_USERATROOM) { ///新用户加入或退出房间 int userID = m.WParam.ToInt32(); int boEntered = m.LParam.ToInt32(); if (boEntered == 1) { m_others.Add(userID); UpdateUserList(userID, m_others.Count - 1); Print("用户:" GetUserNameByID(userID) " 进入房间"); } else { m_others.Remove(userID); for (int i = 0; i < m_MemberItem.Count; i ) { if (m_MemberItem[i].m_UserID == userID) { m_MemberItem.RemoveAt(i); break; } } Print("用户:" GetUserNameByID(userID) " 离开房间"); } UpdateOnlineUser();//更新用户列表 this.Invalidate();//重绘界面,防止界面假死 } base.WndProc(ref m); } #endregion #region 刷新用户列表 private void UpdateOnlineUser() { DataGridViewRow dgvr = new DataGridViewRow(); //保存原选择用户 string m_TempUserName = ""; int m_DGVSelectRow = -1; if (dgv_onlineuser.SelectedRows.Count > 0) { dgvr = dgv_onlineuser.SelectedRows[0]; m_TempUserName = dgvr.Cells["gvc_username"].Value.ToString(); } dgv_onlineuser.Rows.Clear();//清空用户列表 pnl_video.Controls.Clear();//清空所有视频窗口 //显示大家 dgvr = new DataGridViewRow(); dgv_onlineuser.Rows.Add(dgvr); dgvr = dgv_onlineuser.Rows[dgv_onlineuser.Rows.Count - 1]; dgvr.Cells["gvc_username"].Value = "大家"; dgvr.Cells["gvc_audio"].Value = AnyChatCSharpDemo.Properties.Resources.深灰背景; dgvr.Cells["gvc_video"].Value = AnyChatCSharpDemo.Properties.Resources.深灰背景; dgvr.Cells["gvc_character"].Value = AnyChatCSharpDemo.Properties.Resources.深灰背景; dgvr = new DataGridViewRow(); dgv_onlineuser.Rows.Add(dgvr); dgvr = dgv_onlineuser.Rows[dgv_onlineuser.Rows.Count - 1]; dgvr.Cells["gvc_username"].Value = frmLogin.m_UserName; ; dgvr.Cells["gvc_character"].Value = AnyChatCSharpDemo.Properties.Resources.主持人_浅灰; dgvr.Cells["gvc_audio"].Value = AnyChatCSharpDemo.Properties.Resources.麦克; dgvr.Cells["gvc_video"].Value = AnyChatCSharpDemo.Properties.Resources.摄像头; //显示自己 for (int i = 0; i < m_MemberItem.Count; i ) { dgvr = new DataGridViewRow(); dgv_onlineuser.Rows.Add(dgvr); dgvr = dgv_onlineuser.Rows[dgv_onlineuser.Rows.Count - 1]; dgvr.Cells["gvc_username"].Value = m_MemberItem[i].m_UserName; dgvr.Cells["gvc_audio"].Value = AnyChatCSharpDemo.Properties.Resources.麦克 ; dgvr.Cells["gvc_video"].Value = AnyChatCSharpDemo.Properties.Resources.摄像头; dgvr.Cells["gvc_character"].Value = AnyChatCSharpDemo.Properties.Resources.普通人_浅灰; CreateUserVideo(m_MemberItem[i].m_UserID); if (m_TempUserName == m_MemberItem[i].m_UserName) { m_DGVSelectRow = i 1; } } if (m_TempUserName != "" && m_DGVSelectRow > -1) { dgv_onlineuser.Rows[m_DGVSelectRow].Selected = true; } else { dgv_onlineuser.Rows[0].Selected = true; } } #endregion #region 增加或减少用户 private void UpdateUserList(int m_UserID,int m_Index) { clsMemberList.MemberItem m_TempItem = new clsMemberList.MemberItem();//创建用户在线列表(自定义,包含用户属性) StringBuilder m_TempName = new StringBuilder(30); int ret = AnyChatCoreSDK.GetUserName(m_UserID, m_TempName, 30);//获取用户账号 m_TempItem.m_UserName = m_TempName.ToString(); m_TempItem.m_UserID = m_UserID; m_TempItem.m_Index = m_Index; m_TempItem.m_Permission = new int[] { 0, 0, 0 };//用户权限 m_MemberItem.Add(m_TempItem);//添加到在线用户列表 } /// <summary> /// 通过用户ID获得用户账号 /// </summary> /// <param name="m_UserID"></param> /// <returns></returns> private string GetUserNameByID(int m_UserID) { StringBuilder m_TempName = new StringBuilder(30); int ret = AnyChatCoreSDK.GetUserName(m_UserID, m_TempName, 30);//获取用户账号 return m_TempName.ToString(); } /// <summary> /// 通过用户账号获得用户ID /// </summary> /// <param name="m_UserNameTemp"></param> /// <returns></returns> private int GetUserIDByName(string m_UserNameTemp) { int m_TempUserID = -1; for (int i = 0; i < m_MemberItem.Count; i ) { if (m_MemberItem[i].m_UserName == m_UserNameTemp) { m_TempUserID = m_MemberItem[i].m_UserID; break; } } return m_TempUserID; } #endregion #region 用户视频窗口操作 #region 创建用户视频窗口 private void CreateUserVideo(int m_UserID) { //用户视频横列显示规则 int userCount = GetUserCount(); if (userCount > 0 && userCount <= 1) m_ColUserVideo = 1; else if (userCount > 1 && userCount <= 4) m_ColUserVideo = 2; else if (userCount > 4) m_ColUserVideo = 3; int m_PnlCount = pnl_video.Controls.Count; Panel m_ShowWnd = new Panel(); m_ShowWnd.Name = m_UserID.ToString(); m_ShowWnd.Width = (pnl_video.Width) / m_ColUserVideo; m_ShowWnd.Height = m_ShowWnd.Width * 4 / 5; m_ShowWnd.Top = m_PnlCount / m_ColUserVideo * m_ShowWnd.Height m_PnlCount / m_ColUserVideo * 5; m_ShowWnd.Left = m_PnlCount % m_ColUserVideo * m_ShowWnd.Width m_PnlCount % m_ColUserVideo * 5; m_ShowWnd.BackColor = Color.Black; m_ShowWnd.DoubleClick = new EventHandler(ShowWnd_DoubleClick); m_ShowWnd.MouseEnter = new EventHandler(m_ShowWnd_MouseEnter); m_ShowWnd.MouseLeave = new EventHandler(m_ShowWnd_MouseLeave); pnl_video.Controls.Add(m_ShowWnd); AnyChatCoreSDK.SetVideoPos(m_UserID, m_ShowWnd.Handle, 0, 0, m_ShowWnd.Width, m_ShowWnd.Height); AnyChatCoreSDK.UserCameraControl(m_UserID, true); AnyChatCoreSDK.UserSpeakControl(m_UserID, true); } /// <summary> /// 获取在线用户数量(不包括自己) /// </summary> /// <returns>在线用户数量</returns> private int GetUserCount() { int userCount = 0; //int[] ids = new int[] { }; AnyChatCoreSDK.GetOnlineUser(null, ref userCount); return userCount; } #endregion #region 鼠标进入用户视频窗口 void m_ShowWnd_MouseEnter(object sender, EventArgs e) { Control ShowWnd = (Control)sender; string userName = GetUserNameByID(Convert.ToInt32(ShowWnd.Name)); // lbl_user初始化 lbl_user.AutoSize = true; lbl_user.BackColor = System.Drawing.Color.White; lbl_user.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; lbl_user.Name = "lbl_user"; lbl_user.Location = new System.Drawing.Point(176, 503); lbl_user.Size = new System.Drawing.Size(55, 14); this.Controls.Add(lbl_user); lbl_user.Text = userName; lbl_user.Parent = pnl_video; lbl_user.Left = ShowWnd.Left ShowWnd.Width - lbl_user.Width; lbl_user.Top = ShowWnd.Top ShowWnd.Height - lbl_user.Height; lbl_user.BringToFront(); lbl_user.Visible = true; } #endregion #region 鼠标离开用户视频窗口 void m_ShowWnd_MouseLeave(object sender, EventArgs e) { lbl_user.Visible = false; } #endregion #region 双击用户视频窗口 private void ShowWnd_DoubleClick(object sender, EventArgs e) { Control ShowWnd = (Control)sender; if (ShowWnd.Width != m_VideoWidthMax) { foreach (Control C in pnl_video.Controls) { if (C.Name != ShowWnd.Name) { C.Visible = false; } } ShowWnd.Top = (pnl_video.Height - m_VideoHeightMax) / 2; ShowWnd.Left = (pnl_video.Width - m_VideoWidthMax) / 2; ; ShowWnd.Width = m_VideoWidthMax; ShowWnd.Height = m_VideoHeightMax; } else { foreach (Control C in pnl_video.Controls) { if (C.Name != ShowWnd.Name) { C.Visible = true; } } int m_TempIndex = 0; for (int i = 0; i < m_MemberItem.Count; i ) { if (ShowWnd.Name == m_MemberItem[i].m_UserID.ToString()) { m_TempIndex=m_MemberItem[i].m_Index; break; } } ShowWnd.Width = (pnl_video.Width) / m_ColUserVideo; ShowWnd.Height = ShowWnd.Width * 4 / 5; ShowWnd.Top = m_TempIndex / m_ColUserVideo * ShowWnd.Height m_TempIndex / m_ColUserVideo * 5; ShowWnd.Left = m_TempIndex % m_ColUserVideo * ShowWnd.Width m_TempIndex % m_ColUserVideo * 5; } AnyChatCoreSDK.SetVideoPos(Convert.ToInt32(ShowWnd.Name), ShowWnd.Handle, 0, 0, ShowWnd.Width, ShowWnd.Height); } #endregion #region 本地视频窗口双击事件 private void pnl_local_MouseDoubleClick(object sender, MouseEventArgs e) { Control ShowWnd = (Control)sender; if (ShowWnd.Width != m_VideoWidthMax) { foreach (Control C in pnl_video.Controls) { if (C.Name != ShowWnd.Name) { C.Visible = false; } } ShowWnd.Top = (pnl_video.Height - m_VideoHeightMax) / 2; ShowWnd.Left = (pnl_video.Width - m_VideoWidthMax) / 2; ; ShowWnd.Width = m_VideoWidthMax; ShowWnd.Height = m_VideoHeightMax; pnl_video.Controls.Add(ShowWnd); } else { foreach (Control C in pnl_video.Controls) { if (C.Name != ShowWnd.Name) { C.Visible = true; } } ShowWnd.Width = 167; ShowWnd.Height = 140; ShowWnd.Top = 471; ShowWnd.Left = 3; this.Controls.Add(ShowWnd); } //AnyChatCoreSDK.SetVideoPos(Convert.ToInt32(ShowWnd.Name), ShowWnd.Handle, 0, 0, ShowWnd.Width, ShowWnd.Height); int ret = AnyChatCoreSDK.SetVideoPos(-1, pnl_local.Handle, 0, 0, ShowWnd.Width, ShowWnd.Height); } #endregion #endregion #region 窗体加载关闭 #region 窗体加载 private void frmRoom_Load(object sender, EventArgs e) { InitChat();//初始化 //InitUserPanel();//初始化用户面版 //初始化发送按钮右建菜单 ment_item_ctrlenter.Image = null; ment_item_enter.Image = AnyChatCSharpDemo.Properties.Resources.duihao; //初始化字体字号 InitFont(); //m_VideoWidthMax = frmLogin.m_LocalVideoWidth; //m_VideoHeightMax = frmLogin.m_LocalVideoHeight; //m_VideoWidthMax = 640; //m_VideoHeightMax = 480; //音视频状态 chk_localvideo.Checked = m_LocalVideoStatue ; chk_localaudio.Checked = m_LocalAudioStatue; //cbox_video.SelectedIndex = 5;//视频最大化尺寸 #region 采集分辨率 //1=160*120;2=176*144; 3=320*240; 4=352*288; 5=528*384; 6=640*480; 7=704*576 //int m_SelectIndex=0; //switch (frmLogin.m_LocalVideoWidth) //{ // case 160 : // m_SelectIndex=0; // break; // case 176 : // m_SelectIndex=1; // break; // case 320 : // m_SelectIndex=2; // break; // case 352: // m_SelectIndex = 3; // break; // case 528: // m_SelectIndex = 4; // break; // case 640: // m_SelectIndex = 5; // break; // case 704: // m_SelectIndex = 6; // break; //} //cbox_caiji.SelectedIndex = m_SelectIndex; #endregion } #endregion #region 窗体关闭 private void frmRoom_FormClosing(object sender, FormClosingEventArgs e) { AnyChatCoreSDK.LeaveRoom(m_RoomID); AnyChatCoreSDK.Logout(); System.Environment.Exit(0); } #endregion #endregion #region 文本发送 /// <summary> /// 发送按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_sendtxt_Click(object sender, EventArgs e) { string m_Message = rtxt_sendtxt.Text; if (m_Message.Length == 0) { MessageBox.Show("发送文本不能为空","提示"); return; } int length = UnicodeEncoding.Default.GetBytes(m_Message).Length; int m_TempUserID = -1; string m_TempUserName = "大家"; if (dgv_onlineuser.SelectedRows.Count != 0) { DataGridViewRow dgvr = dgv_onlineuser.SelectedRows[0]; m_TempUserName = dgvr.Cells["gvc_username"].Value.ToString(); for (int i = 0; i < m_MemberItem.Count; i ) { if (m_MemberItem[i].m_UserName == m_TempUserName) { m_TempUserID = m_MemberItem[i].m_UserID; break; } } } bool m_Secret = false; if (m_TempUserID != -1) m_Secret = true; int ret = AnyChatCoreSDK.SendTextMessage(m_TempUserID, m_Secret, m_Message, length); //显示聊天内容 string m_DispMsg = "我 To " m_TempUserName " "; ShowText(m_DispMsg, txt_Accept.TextLength, m_DispMsg.Length, Color.Green, new Font("黑体", 9, FontStyle.Bold)); ShowText(DateTime.Now.ToString(), txt_Accept.TextLength, DateTime.Now.ToString().Length, Color.Green, new Font("黑体", 9, FontStyle.Bold)); ShowText("\r\n", txt_Accept.TextLength, 4, Color.Blue, new Font("宋体", 12)); ShowText(" ", txt_Accept.TextLength, 4, Color.Blue, new Font("宋体", 12)); ShowText(m_Message, txt_Accept.TextLength, m_Message.Length, Color.Black, new Font("黑体", 9)); ShowText("\r\n\r\n", txt_Accept.TextLength, 8, Color.Blue, new Font("宋体", 12)); rtxt_sendtxt.Text = ""; } /// <summary> /// 键盘按下组合键 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void rtxt_sendtxt_KeyDown(object sender, KeyEventArgs e) { if (ment_item_ctrlenter.Image != null)//Ctrl Enter { if (e.Control == true && e.KeyCode == Keys.Enter) { btn_sendtxt_Click(null, null); } } else//Enter { if (e.KeyCode == Keys.Enter) { btn_sendtxt_Click(null, null); } } } /// <summary> /// 键盘释放组合键 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void rtxt_sendtxt_KeyUp(object sender, KeyEventArgs e) { if (ment_item_ctrlenter.Image != null)//Ctrl Enter { if (e.Control == true && e.KeyCode == Keys.Enter) { rtxt_sendtxt.Text = ""; } } else//Enter { if (e.KeyCode == Keys.Enter) { rtxt_sendtxt.Text = ""; } } } /// <summary> /// 发送按钮右建菜单(Ctrl Enter) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ment_item_ctrlenter_Click(object sender, EventArgs e) { ment_item_ctrlenter.Image = AnyChatCSharpDemo.Properties.Resources.duihao; ment_item_enter.Image = null; } /// <summary> /// 发送按钮右建菜单(Enter) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ment_item_enter_Click(object sender, EventArgs e) { ment_item_enter.Image = AnyChatCSharpDemo.Properties.Resources.duihao; ment_item_ctrlenter.Image = null; } /// <summary> /// 初始化字体,字号 /// </summary> private void InitFont() { int m_SelectIndex = 0; int m_Index = 0; System.Drawing.Text.InstalledFontCollection m_ObjFont = new System.Drawing.Text.InstalledFontCollection(); foreach (System.Drawing.FontFamily m_Font in m_ObjFont.Families) { cmb_font.Items.Add(m_Font.Name.ToString()); if (m_Font.Name == "黑体") m_SelectIndex = m_Index; m_Index ; } cmb_font.SelectedIndex = m_SelectIndex; foreach (string m_FontSize in m_AllFontSizeName) { cmb_fontsize.Items.Add(m_FontSize); } cmb_fontsize.SelectedItem = "小五"; } #endregion #region 初始化用户列表面版 private void InitUserPanel() { pnl_userlist.Width = 285; pnl_userlist.Height = 400; pnl_userlist.Top = (this.Height - 30 - pnl_userlist.Height) / 2; pnl_userlist.Left = this.Width - 41; } /// <summary> /// 显示与隐藏用户面版 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void pic_userlistdisp_Click(object sender, EventArgs e) { if (pic_userlistdisp.BackColor == Color.Green) { pic_userlistdisp.BackColor = Color.Blue; pnl_userlist.Left = this.Width - 291; } else { pic_userlistdisp.BackColor = Color.Green; pnl_userlist.Left = this.Width - 41; } } #endregion #region 单击用户列表 private void dgv_onlineuser_Click(object sender, EventArgs e) { try { if (dgv_onlineuser.SelectedRows.Count == 0) return; DataGridViewRow dgvr = dgv_onlineuser.SelectedRows[0]; string m_TempUserName = dgvr.Cells["gvc_username"].Value.ToString(); if (m_TempUserName == frmLogin.m_UserName) return; lbl_touser.Text = "我 对 " m_TempUserName " 说:"; } catch (Exception ex) { } } private void dgv_onlineuser_SelectionChanged(object sender, EventArgs e) { dgv_onlineuser_Click(null, null); } #endregion #region 权限设置 #region 单击视频权限 /// <summary> /// 单击视频权限 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void menu_item_video_Click(object sender, EventArgs e) { try { if (dgv_onlineuser.SelectedRows.Count == 0) return; DataGridViewRow dgvr = dgv_onlineuser.SelectedRows[0]; string m_TempUserName = dgvr.Cells["gvc_username"].Value.ToString(); if (m_TempUserName == frmLogin.m_UserName || m_TempUserName=="大家") return; int m_TempUserID = GetUserIDByName(m_TempUserName); AnyChatCoreSDK.UserCameraControl(m_TempUserID, menu_item_video.Checked); } catch (Exception ex) { } } #endregion #region 用户状态 private void menu_item_status_Click(object sender, EventArgs e) { try { //if (dgv_onlineuser.SelectedRows.Count == 0) return; //DataGridViewRow dgvr = dgv_onlineuser.SelectedRows[0]; //string m_TempUserName = dgvr.Cells["gvc_username"].Value.ToString(); //if (m_TempUserName == frmLogin.m_UserName || m_TempUserName == "大家") return; //int m_TempUserID = GetUserIDByName(m_TempUserName); //int m_InfoName = Convert.ToInt32(txt_1.Text.Trim()); //MessageBox.Show(m_TempUserID.ToString()); //int m_Infoval = -1; //int ret = AnyChatCoreSDK.QueryUserState(m_TempUserID, m_InfoName, ref m_Infoval, 1000); //StringBuilder m_Infoval = new StringBuilder(100); //IntPtr m_Infoval =(IntPtr)0; //byte[] m_Infoval = new byte[100]; //int result = Init_com(ref m_Infoval.ToCharArray()); //int m_Infoval = 10; //int ret = AnyChatCoreSDK.QueryUserState(m_TempUserID, m_InfoName, ref m_Infoval, sizeof(int)); //int len = 100; //byte[] buff = new byte[len]; //Marshal.Copy(m_Infoval, buff, 0, len); //string m_Command = Encoding.Default.GetString(buff); //txt_2.Text = ret.ToString() ":" m_Infoval.ToString(); //txt_2.Text = ret.ToString(); } catch (Exception ex) { //txt_2.Text = ex.Message; } } #endregion #endregion #region 显示隐藏文本聊天区 private void pnl_visableword_MouseEnter(object sender, EventArgs e) { if (pnl_word.Left == 658)//显示文本区状态 { pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.隐藏放上; } else { pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.取消隐藏放上; } } private void pnl_visableword_MouseDown(object sender, MouseEventArgs e) { if (pnl_word.Left == 658)//显示文本区状态 { pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.隐藏按下; } else { pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.取消隐藏按下; } } private void pnl_visableword_MouseUp(object sender, MouseEventArgs e) { if (pnl_word.Left == 658)//显示文本区状态 { pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.隐藏放上; pnl_word.Left = this.Width - 17-6; pnl_video.Width = 640; } else { pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.取消隐藏放上; pnl_word.Left = 658; pnl_video.Width = 480; } } private void pnl_visableword_MouseLeave(object sender, EventArgs e) { if (pnl_word.Left == 658)//显示文本区状态 { pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.隐藏发送面板; } else { pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.显示发送面板; } } #endregion #region 设置音视频状态 /// <summary> /// 设置视频状态 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void chk_localvideo_CheckedChanged(object sender, EventArgs e) { int ret = AnyChatCoreSDK.UserCameraControl(-1, chk_localvideo.Checked); } /// <summary> /// 设置音频状态 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void chk_localaudio_CheckedChanged(object sender, EventArgs e) { int ret = AnyChatCoreSDK.UserSpeakControl(-1, chk_localaudio.Checked); } #endregion #region 视频最大化显示尺寸 #endregion #region 重新设置视频分辨率 private void cbb_fbl_SelectedIndexChanged(object sender, EventArgs e) { if (cbb_fbl.SelectedIndex == 0) { int bUseAppParam = 0; //应用本地视频编码参数,使得前述修改即时生效(参数为int型:1 使用新参数,0 使用默认参数) AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_APPLYPARAM, ref bUseAppParam, sizeof(int)); } else { int bitrate = 0; //0表示质量模式 //设置本地视频编码的码率 AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_BITRATECTRL, ref bitrate, sizeof(int)); int keyframe = 25; //设置本地视频编码的关键帧间隔 AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_GOPCTRL, ref keyframe, sizeof(int)); int framerate = 25; //设置本地视频编码的帧率 AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_FPSCTRL, ref framerate, sizeof(int)); int defaultParam = 3; // 设置本地视频编码的预设参数 AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_PRESETCTRL, ref defaultParam, sizeof(int)); int bUseAppParam = 1; //应用本地视频编码参数,使得前述修改即时生效(参数为int型:1 使用新参数,0 使用默认参数) AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_APPLYPARAM, ref bUseAppParam, sizeof(int)); } } #endregion #region 调节声音 #region 调节滑块 #endregion #endregion #region 传输文件及透明通道演示 string sendPath; //发送文件地址 string receivePath; //接收文件地址 #region 接收文件 private void Received_TransFile(int userId, string fileName, string filePath, int fileLength, int wParam, int lParam, int taskId, int userValue) { //这里用1作为接收标记 if (wParam == 1) { FileInfo fi = new FileInfo(filePath); fi.MoveTo(receivePath "\\" fi.Name); Print(receivePath "\\" fi.Name "文件接收成功"); } } #endregion #region 透明通道数据 private void Received_TransBuffer(int userId, IntPtr buf, int len, int userValue) { //过滤信息() string m_Command = Marshal.PtrToStringAnsi(buf); try { if (m_Command.Length > 3) { string[] m_Packet = m_Command.Split(":".ToCharArray()); //选择是否接收文件 if (m_Packet[0] == "003" && m_Packet[3] == "file") { int m_TempUserID = Convert.ToInt32(m_Packet[1]); string m_pacName = GetUserNameByID(m_TempUserID); DialogResult r = MessageBox.Show("文件名:" m_Packet[2].ToString() ",是否接收?", m_pacName "发送文件请求", MessageBoxButtons.YesNo); if (r == System.Windows.Forms.DialogResult.Yes) { FolderBrowserDialog fbd = new FolderBrowserDialog(); if (fbd.ShowDialog() == DialogResult.OK) { receivePath = fbd.SelectedPath; string m_Message = "003:" m_myUserID.ToString() ":" "fileisok:"; byte[] buffer = Encoding.Default.GetBytes(m_Message); int rett = AnyChatCoreSDK.TransBuffer(m_TempUserID, buffer, buffer.Length); } } else { string m_Message = "003:" m_myUserID.ToString() ":" "fileisno:" m_Packet[2].ToString(); byte[] buffer = Encoding.Default.GetBytes(m_Message); int rett = AnyChatCoreSDK.TransBuffer(m_TempUserID, buffer, buffer.Length); } } //发送文件 else if (m_Packet[0] == "003" && m_Packet[2] == "fileisok") { int taskId = 0; int m_TempUserID = Convert.ToInt32(m_Packet[1]); int flag = AnyChatCoreSDK.TransFile(m_TempUserID, sendPath, 1, 0, 0, ref taskId); Print("成功发送" sendPath "文件"); } else if (m_Packet[0] == "003" && m_Packet[2] == "fileisno") { string m_tempName = GetUserNameByID(Convert.ToInt32(m_Packet[1])); Print(m_tempName "拒绝接收文件" m_Packet[3].ToString()); } } } catch (Exception ex) { } } #endregion #region 请求发送 private void btn_transfile_Click(object sender, EventArgs e) { if (dgv_onlineuser.SelectedRows.Count == 0) { Print("文件发送失败,请选择目标用户"); return; } else { DataGridViewRow dgvr = dgv_onlineuser.SelectedRows[0]; string m_TempUserName = dgvr.Cells["gvc_username"].Value.ToString(); if (m_TempUserName == frmLogin.m_UserName || m_TempUserName == "大家") { Print("文件发送失败,请选择目标用户"); return; } else { OpenFileDialog dlgopenFile = new OpenFileDialog(); dlgopenFile.Title = "选择需要发送的文件"; DialogResult dr = dlgopenFile.ShowDialog(); if (dr == DialogResult.OK) { if (File.Exists(dlgopenFile.FileName)) { sendPath = dlgopenFile.FileName; //int taskId = 0; int m_TempUserID = GetUserIDByName(m_TempUserName); //发送命令 FileInfo fi = new FileInfo(dlgopenFile.FileName); string m_Message = "003:" m_myUserID.ToString() ":" fi.Name ":" "file"; byte[] buffer = Encoding.Default.GetBytes(m_Message); int rett = AnyChatCoreSDK.TransBuffer(m_TempUserID, buffer, buffer.Length); Print("向" m_TempUserName "发送文件,等待接收..."); } } dlgopenFile.Dispose(); dlgopenFile = null; } } } #endregion #endregion } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论