基于C++实现视频聊天软件(一)
初来乍到,接触到音视频领域,在这期间参考开源代码和项目代码,用C++做了一个类似QQ的视频聊天Demo,这里将其中开源的视频通讯技术分享给大家。
工具: vs2010,MFC制作界面,网络传输机制(Socket等),
VFW视频采集,FFmpeg编解码器,SDL播放
聊天与文件传输
1. MFC界面
选择做聊天软件,首先要选取一个界面工具,做界面可不是底层的C++语言的强项,传统的有微软的MFC,比较庞大,开源的有QT、DirectUI,做出界面很炫,使用也比较简单。但为配合vs2010,还是选择了MFC这种适合底层语言的界面工程。
话不多说,直接上图:
怎么样,用MFC也可以做出很炫的界面的。以上两个界面,可以理解一个客户端,一个服务端,客户端登录服务器与其连接,然后两者互发消息进行聊天。
该聊天软件的主要功能有:
登录 文字聊天表情聊天文件传输视频聊天
下面介绍几种实用的功能,基础功能大家自己找资料补一下。
2. 编辑框CEdit的使用
在Properties面板上添加一个编辑框(Edit Control),右键点击属性,修改ID,选上multiline、vertical scroll 和Auto Vscroll属性,添加滚动条并且实现自动换行;如果要实现滚动条自动回滚到最下方,可添加如下代码(m_edit为该编辑框的Control变量)
m_edit.LineScroll(m_edit.GetLineCount());
依次创建发送框、接收框,分别为其添加CString型数值变量m_editInput、m_editOutput,创建send按钮,聊天软件要实现的功能是:
(1)发送框输入的内容保存起来,通过网络发送出去
(2)发送框的内容显示到接收框上
参考代码如下:
void CclientDlg::OnBnClickedSendButton()
{ UpdateData(TRUE);Send(m_editInput); //网络发送函数,需自己实现m_editOutput = m_editOutput + "\r\n 我:" +m_editInput; m_editInput = ""; //清空发送框UpdateData(FALSE); m_editOutput.LineScroll(m_editOutput.GetLineCount());}
3. 文件对话框、发送文件
如果要向对方发送文件,我们希望实现这样的功能:
点击”文件“图标按钮,弹出文件对话框,然后在本地计算机中选择文件,发送出去。
MFC封装了文件对话框类CFileDialog,通过调用类函数,实现发送文件功能,看下面:
void CclientDlg::OnBnClickedFileButton()
{//设置过滤器TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");// 构造打开文件对话框CFileDialog fileDlg(TRUE,_T("txt"),NULL,0,szFilter,this);CString strFilePath,strText;// 显示打开文件对话框if (IDOK == fileDlg.DoModal()){TFileInfo tempFileInfo;strFilePath = fileDlg.GetPathName(); //获取文件路径SetDlgItemText(IDC_INPUT_EDIT,strFilePath+" 正在上传...");CStdioFile file2;if(!file2.Open( strFilePath ,CFile::modeRead)) //打开文件return;while(true)//按行循环读取文件内容存入strText{if(!file2.ReadString(strText))break;Send(strText); //发送出去}}
}
当然这里只是最简单的文本文件,如果是图片、视频等文件,可以借用网络传输工具Socket实现,在项目中,我有很好的网络传输工具,直接拿来用了。
4. 为按钮添加图片
为了界面美观,有时我们需要为按钮添加相应的图片,如表情位图、文件位图、视频位图,以及通过点击按钮实现位图的切换,如暂停、取消位图。接下来就介绍为按钮添加位图的方法。
1. 对话框上创建按钮资源IDC_BUTTON时选择 owner draw (自己画);
(注:选择自画时,Bitmap属性一定要设置False,不然会出错)
2. 在对话框.h文件内定义位图按钮对象 CBitmapButton m_button;
3. 导入准备好的位图到资源中,并修改ID (如:IDB_START);
4. 在初始化函数 BOOL CclientDlg::OnInitDialog() 中 添加如下代码:
{
BOOL start = 0;
m_button.LoadBitmaps(IDB_START,IDB_PAUSE);
m_button.SubclassDlgItem(IDC_PAUSE_BUTTON,this);
m_button.SizeToContent();
}
如果我们想通过点击按钮,实现两种位图的切换,可以这样实现:
void CclientDlg::OnBnClickedPauseButton()
{//转换开始、暂停图标if(!start){m_button.LoadBitmaps(IDB_START); //切换到开始m_button.SizeToContent(); start = 0;}else{m_button.LoadBitmaps(IDB_PAUSE); //切换到暂停m_button.SizeToContent(); start = 1;}//记得刷新按钮Invalidate();
}
5. 显示进度条
在文件上传时,当我们想知道上传的进度,可以通过绘制进度条类实现。
进度条控制在MFC类库中的封装类为CProgressCtrl,通常仅作为输出类控制,所以其操作主要是设置进度条的范围和当前位置,并不断地更新当前位置。过程很简单,可以实现基本的显示功能,如下:
1. 对话框上添加一条进度条IDC_PROGRESS 和一个静态文本框 IDC_STATIC
2. 在对话框.h文件内定义进度条对象 CProgressCtrl MyProCtrl;
3. 对话框.cpp文件中绑定对象:void CclientDlg::DoDataExchange(CDataExchange* pDX){ DDX_Control(pDX, IDC_PROGRESS_up, MyProCtrl);}
4. OnInitDialog()进度条初始化MyProCtrl.SetRange(0,100);MyProCtrl.SetPos(0);
5. 计算上传进度百分比Rate,然后这样
{MyProCtrl.SetPos(lParamRate*100); //进度条移动CString str;str.Format(_T("%d%%"),lParamRate*100);GetDlgItem(IDC_STATIC2)->SetWindowText(str); //显示百分比if (lParamRate == 1) //上传结束时,更新图标{m_button.LoadBitmaps(IDB_START); m_button.SizeToContent(); start = 0;Invalidate();}
}
6. 表情聊天
进一步,如果想实现类似QQ表情的聊天形式,可以进一步实现,过程就有点麻烦了,还好有大神们的”前车之鉴“,MFC RichEdit就是比较好的工具,做出来也很炫,感兴趣的可以点开参考:
CRichEditCtrlEx支持静态表情聊天类的使用
向Richedit插入动态Gif的实现(关于QQ表情功能的制作)
先写到这里吧,本来是想写关于视频聊天传输的东西的,前边的聊天界面就介绍了这么多,下一章接着写视频传输,先放两张图片感受下效果,哈哈。。
目录
- 聊天与文件传输
- MFC界面
- 编辑框CEdit的使用
- 文件对话框发送文件
- 为按钮添加图片
- 显示进度条
- 表情聊天
- 目录
基于C++实现视频聊天软件(一)相关推荐
- 基于Delphi的网上视频聊天软件
摘要:目前网上视频聊天软件.视频会议软件.可视IP电话软件随处可见,你是否想自己做一个玩玩?其实这类软件无非是视频加上网络而建成的.如果熟悉视频捕捉和网络传输技术,根本就难不倒你.微软为软件开发人员提 ...
- 用Delphi开发视频聊天软件
一.引言 我们知道视频聊天软件的关键技术在于采集视频,并实时传输给聊天软件在线的人.对于视频的采集,这里采用微软公司的关于数字视频的一个软件包VFW(Video for Windows).相信很多人对 ...
- 视频聊天软件的技术实现
社会经济的发展使得人民生活水平不断提高,越来月注重精神享受.而科技的发展新媒体和自媒体的突飞猛进,给人们的生活带来了便利.网络视频聊天娱乐就是在这种蓬勃发展的互联网市场经济下的产物,也是现代更多草根通 ...
- 都秀多人视频聊天软件【常用软件】
都秀视频聊天软件是北京都秀网络科技有限公司基于宽带网络推出的"全新网络多人视频聊天工具".都秀聊天室整合了文本.语音.视频等多种互联网通信形式于一身,旨在为广大互联网用户提供融合数 ...
- 基于Internet的语音聊天软件设计与实现
基于Internet的语音聊天软件设计与实现 朱国华,夏敏捷 (中原工学院 计算机科学系 ,河南 郑州 450007) 摘要:文章对网络环境下语音通信的原理进行了系统地分析,详细阐述了语音的采集.语音 ...
- 如何从视频聊天软件源码下手,解决敏感词屏蔽问题
视频聊天平台鱼龙混杂,用户素质良莠不齐,时常会出现用户名中出现的不雅字符.聊天室内出现不和谐文字的情况,因此在用户每次发言时,视频聊天软件源码都会自动对其文字进行验证,通过匹配"脏字库&qu ...
- 一对一视频聊天软件源码,Android AlertDialog 对话框
一对一视频聊天软件源码,Android AlertDialog 对话框实现的相关代码 button = (Button) findViewById(R.id.button_alertDialog);b ...
- 基于webrtc的视频聊天室(一)之千里之行始于足下
在不采用流媒体的情况下,也能够实现视频聊天室:可这需要在客户端建立多个连接,对客户端要求很高(上行带宽以及浏览器编解码速度),所以引入 kurento 流媒体服务器来做中转,或许后续不仅仅只是做中转. ...
- 一对一视频聊天软件源码,实现简单侧边栏弹出动画
一对一视频聊天软件源码,实现简单侧边栏弹出动画的相关代码 <!DOCTYPE html> <html lang="en"><head><m ...
最新文章
- 大写的服!中科大博士20万字论文:如何给女朋友送礼物
- JQUERY知识总结
- zigbee协议栈学习(二)
- 用类氢轨道计算交换积分和Li原子2S谱项能级
- 响应式编程RxJava (一)
- 华为手机输入键盘声音_华为手机键盘隐藏7个秘密,你只用来打电话?来一起解锁新玩法...
- 基于IMAGE法的房间回响模型创建、C++代码实现、matlab仿真
- jstl core and jstl fn
- 在吗,支付宝土味情歌撩到你了吗?网友:撩到了,好酸
- windows 下安装Python
- 何把SATA/RAID驱动集成到win xp 安装盘里?
- Linux终端设置成256色模式,如何设置LinuxX终端,使Emacs可以访问256色?
- 使用struts2 做客户端校验时抛出freemarker模版错误异常的处理
- kettle入门教程
- 如何获取JVM的dump文件
- 游戏应用快速审核上架
- Hive建外表操作以及其它修改表操作 hive外表与内表区别
- 【愚公系列】2022年11月 uniapp专题-优购电商-个人中心页面
- php strstr批量替换,也就这样,
- uc 浏览器不能打开网页