基于QT的视频聊天工具的设计与实现何毅.docx
《基于QT的视频聊天工具的设计与实现何毅.docx》由会员分享,可在线阅读,更多相关《基于QT的视频聊天工具的设计与实现何毅.docx(29页珍藏版)》请在冰豆网上搜索。
基于QT的视频聊天工具的设计与实现何毅
毕业论文(设计)
论文题目:
基于QT的视频聊天工具的设计与实现
学生姓名:
学号:
1008040209
所在院系:
电气信息工程学院
专业名称:
通信工程
届次:
2014届
指导教师:
淮南师范学院本科毕业论文(设计)
诚信承诺书
1。
本人郑重承诺:
所呈交的毕业论文(设计),题目《
》是本人在指导教师指导下独立完成的,没有弄虚作假,没有抄袭、剽窃别人的内容;
2。
毕业论文(设计)所使用的相关资料、数据、观点等均真实可靠,文中所有引用的他人观点、材料、数据、图表均已注释说明来源;
3。
毕业论文(设计)中无抄袭、剽窃或不正当引用他人学术观点、思想和学术成果,伪造、篡改数据的情况;
4.本人已被告知并清楚:
学院对毕业论文(设计)中的抄袭、剽窃、弄虚作假等违反学术规范的行为将严肃处理,并可能导致毕业论文(设计)成绩不合格,无法正常毕业、取消学士学位资格或注销并追回已发放的毕业证书、学士学位证书等严重后果;
5.若在省教育厅、学院组织的毕业论文(设计)检查、评比中,被发现有抄袭、剽窃、弄虚作假等违反学术规范的行为,本人愿意接受学院按有关规定给予的处理,并承担相应责任。
学生(签名):
日期:
年月
基于QT的视频聊天工具的设计与实现
学生:
何毅(指导老师:
李营)
(淮南师范学院电气信息工程学院)
摘要:
QTCreator是一个跨平台的、完整的QT集成开发环境,其中包括了高级C++代码编辑器、项目和生成管理工具、集成的上下文相关的帮助系统、图形化调试器、代码管理和浏览工具等[1]。
本论文通过所学的C++面向对象的语言,利用QTCreator设计了一个简单且又美观的视频聊天工具。
在程序设计过程中,通过调用QTCreator库函数以及一些算法来实现相应的功能.最终软件实现“登录”、“显示在线用户"、“文字聊天"、“视频”等基本功能。
关键词:
视频聊天;QT;Video4Linux2;ALSA
TheDesignandImplementationofVideoChatToolBasedonQT
Student:
HeYi(GuidanceTeacher:
LiYing)
(CollegeofElectricalandInformationEngineering,HuainanNormalUniversity)
Abstract:
QTCreatorisacross—platform,completeQTintegrateddevelopmentenvironment,IncludingtheadvancedC++codeeditor,projects,andproducemanagementtools,integratedcontextualhelpsystem,graphicaldebugger,codemanagementandbrowsingtools,etc..ThroughlearningC++objectorientedlanguages,designedasimpleandbeautifulvideochattoolbyQTCreator.By callingtheQTCreatorlibraryfunctions,andusingsomealgorithmtorealizethecorrespondingfunctionduringtheprocessofprogramdesign.Theultimatesuccessofthesoftwareachievetheafewbasicfunctions:
”login",”showtheonlineuser","chat”,"video"andsoon.
Keywords:
Facetime;QT;Video4Linux2;ALSA
1绪论
1.1聊天软件介绍
21世纪是一个网络高速发展的时代。
国际互联网又称因特网,它是一个全球性的网络,是公用信息的一种载体,属于大众传媒的一种,它具有快捷性、普及性等特点,是现今最流行且最受欢迎的传媒之一.互联网是即时通信软件以展的基础,然而即时通信软件又反过来极大的扩展了互联网络的应用[2]。
现今的互联网已经广泛应用在现实生活中。
我们可以通过互联网聊天、玩游戏、查阅东西等等。
作为现代电脑电子技术的产物之一的聊天软件(称即时聊天软件IM),在互联网的信息交流的过程中扮演着一个重要的角色。
即时聊天软件主要提供基于互联网的客户端的语音、视频、文字的传输.它可以增进人们之间的交流、沟通,可以为人们提供跨市、跨省、甚至跨国之间的互通,极大的为人们的交流提供了方便,从而满足人们的需求。
在将来的发展中也必将是一个不可或缺的部分。
1。
2“视频聊天工具”的发展概况
“视频聊天”是可以通过摄像头看到对方图像的一种交流方式,与此同时可以直接通过麦克风进行语音聊天。
与起初的即时聊天软件所不同的体验就是它可以拉近人与人之间的距离,让人倍感亲切,使聊天也变得更加有趣起来。
从另一个方面来考虑,在面对广大群众使用的时候,对于那些打字慢的人来说,也解决了他们因打字慢而感到烦恼的问题。
中国目前使用最广泛的聊天软件之一就是腾讯QQ,然而腾讯QQ不是简单的即时通信软件,它支持即时传送视频、音频和文件等诸多功能.而另一款较流行的软件则是微软公司推出的MSN,它也可以进行语音对话、视频会议等即时交流。
还有很多诸如此类的软件,其实现的功能也大体相同。
由些可以看出,音视频聊天的这种即时交流方式已经成为一种发展趋势,也是符合广大人民群众需求的。
2需求分析
2.1功能分析
利用QT设计出一个可以实现实时文字聊天、语音聊天和视频聊天的基于服务器的聊天工具。
客户端要有登录界面、主界面、聊天界面、视频聊天界面以及语音聊天界面.
登录界需要输入用户名和登录按钮。
对于用户名的输入有以下规定:
(1)用户名不得过长,否则提示输入的用户名太长,让用户重新输入一个用户名;
(2)用户名不能为空;(3)如果输入的用户名被服务器检测到同名用户,需重新输入一个不同的用户名,以上3种情况都无法登录服务器。
主界面必须显示自己的登录名并且可以显示当前登录服务器的用户,当有用户登录时,在主界面上会增加该登录用户;用户退出时,这个用户会在主界面上消失.并且用户可以通过双击用户名与该用户进行对话。
聊天界面要显示当前与谁在聊天,并且显示发送和接收信息的时间.在该界面需要有开启视频聊天和语聊天的按钮。
视频聊天和语音聊天界面只需要有一个终止语音或者终止视频聊天的按钮即可。
2.2可行性分析
该软件是图形界面实现的,通过编译后会出现一个图形界面。
成功登录后,会显示在线用户,并且可以与每一个用户进行交流,可以实现视频、语音聊天,操作简单,使用方便.
2。
3流程图
2。
3。
1软件实现主流程
图1软件实现主流程图
2.3.2用户登录流程图
图2用户登录流程图
2。
3。
3聊天流程图
图3聊天流程图
2.3.4视频聊天流程图
图4音视频聊天流程图
3开发工具及相关技术简介
3.1开发工具简介
QT是由奇趣科技在1991年开发的一个跨平台的C++图形用户界面应用程序的开发框架。
它的跨平台性意味着在Linux下编写的Qt程序也是有效的MicrosoftWindows程序[3]。
它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能,功能非常强大。
它可以用来开发GUI程序,也可以开发非GUI程序,诸如控制台工具和服务器等.QT是面向对象的框架,使用特殊代码生成扩展。
QT的开发语言是C++。
最初Qt主要是为跨平如的软件开发者提供统一的,精美的图形用户编程接口,但是现在它提供统一的网络和数据库操作的编程接口。
由于Qt的出现,使得UNIX和LINUX这些操作系统的人机界面更加精美。
QT的优点:
(1)QT具有优良的跨平台性,可以支持多个操作系统,如MicrosoftWindows95/98,MicrosoftWindowsNT,Linux,Solaris,SunOS,HP-UX,DigitalUNIX(OSF/1,Tru64),Irix,FreeBSD等等;
(2)QT具有良好的封装机制,使得QT的模块化程度非常高,可重用性也较好,这对于开发者来说是非常方便的。
然后QT又提供了一种称为信号与槽(signals/slots)的机制来代替callback,使得元件之间的协同工作就能得更加简单.
(3)QT中包含多达250个以上的C++类.
(4)支持2D/3D图形渲染.
(5)支持OpenGL。
(6)大量的开发文档.
(7)XML支持等。
3.2关键技术
3.2.1Video4Linux2相关技术简介
V4L(videoforlinux)[4]是AlanCox针对视频设备开发的应用程序接口(API)[5]。
开始出现是在Linux2.1.x内核版本中,可以实现图像采集。
由于它的灵活性和扩展性上面的缺陷,渐渐被V4L2代替[6],而V4L2是在Linux2.5.x版本内核中开始集成的[7].Video4Linux2是VideoForLinuxTwo的简称,是Linux系统下进行视频音频等应用开发的应用编程接口.Video4Linux2还提供一些无线电通信以及文字电视广播解码等的数据接口,并且结合视频采集设备和相应的驱动程序,就可以实现图像采集[8].本次设计是采用Video4Linux2提供的数据结构、应用函数等,实现Linux下USB摄像头数据的采集功能。
在Linux系统下,遵循一切设备皆是文件的原则,所有的外设都会被看成是一种特殊文件进行处理,又称之为设备文件。
在Linux下,系统调用的各种库函数的实质是它们直接或者间接地提供内核与应用程序之间的接口,然而设备驱动程序则是内核与外设之间的接口,它的功能是完成设备的初始化和释放以及对设备文件的各种操作的中断处理。
在对视频设备数据进行读/写的过程中,可以通过read/write或者内存映射[9]的方法来获得内核空间的图像数据。
通过Video4Linux2来实现视频图像采集的流程如下:
1。
打开视频设备文件,获得文件描述符。
intdevfd=open(devpath,O_RDWR|O_TRUNC);
if(devfd<0)
{
sys_err(“opendeviceerror”);
}
2。
查看设备功能。
structv4l2_capabilitycap;
Clear_struct(cap);
if(ioctl(devfd,VIDIOC_QUERYCAP,&cap)〈0)
{
Sys_warn(“warn,getdeviceInfomation”)
}
在Linux中,ioctl提供了一个用于控制设备及描述符的行为和配置底层服务的接口,可以对设备I/O通道进行管理。
如上所示,调用VIDIOC_QUERYCAP来取得设备文件的属性参数并存储于cap结构中。
3.设置图像采集的格式,如设备图片的高度和宽度,像素格式等。
structv4l2_formatfmt;
Clear_struct(fmt);
fmt。
fmt.pix。
field=V4L2_FIELD_ANY;
fmt。
fmt。
pix.width=conf—>width;
fmt.fmt。
pix。
height=conf—>height;
fmt。
fmt。
pix。
pixelformat=conf->format;
fmt.type=Capture;
if(ioctl(devfd,VIDIOC_S_FMT,&fmt)<0)
{
Sys_warn(“warn,getformat");
}
先将fmt结构填入适当的参数,再通过VIDIOC_S_FMT来对设备的参数进行设置。
4。
初始化内存是映射
1)设置内存映射的模式以及缓存数数量
structv4l2_requestbuffersreqbuf;
Clear_struct(reqbuf);
reqbuf.count=tmp_nums;
reqbuf。
type=Capture;
reqbuf。
memory=V4L2_MEMORY_MMAP;
if(ioctl(devfd,VIDIOC_REQBUFS,&reqbuf)〈0)
{
Sys_err(“requestbufferqueueerror”);
}
调用VIDIOC_REQBIFS命令参数的ioctl函数分配自定义的缓存数量.
2)将设备缓存映射到用户空间
structv4l2_bufferbuf;
uinti=0;
for(i=0;i{
Clear_struct(buf);
buf.index=i;
buf。
type=Capture;
if(ioctl(devfd,VIDIOC_QUERYBUF,&buf)<0)
{
sys_err(“Jumpintoqueueerror”);
}
}
调用VIDIOC_QUERYBUF命令参数的ioctl函数将设备缓存映射到应用程序的内在分配空间。
3)缓存加入缓存队列,准备图像数据采集
inttype=Capture;
if(ioctl(devfd,VIDIOC_STREAMON,&type)〈0)
{
sys_warn(“openvideostreamerror”);
}
调用VIDIOC_STREAMON命令参数的ioctl的函数,在for循环中将空缓存加入等待输入缓存队列,缓存加入等待输入缓存队列后,就可以使用这些缓存数据了。
5.开始图像采集并循环采集
6.停止采集并关闭设备
close(fd);
free(frame);
图5基于V4L2的视频采集流程[10]
3。
2。
2ALSA相关技术介绍
ALSA是一个致力于开发高质量的Linux声音子系统的软件项目。
在Linux2.6内核之前都是OSS。
因为ALSA相对于OSS来说,它能高效地支持从消费类入门级声卡到专业级音频设备所有类型的音频接口,完全模块化的设计,支持对称多处理线程安全并对OSS的向后兼容等优点,另外ALSA还提供了alsa—lib用户空间的库,从而简化应用程序的开发。
ALSA是一个音频驱动集,并且源代码是完全开放的,它不仅提供了类似于OSS的内核驱动模块,还提供了一组函数库,以简化应用程序编写.开发人员可以利用这些库函数,轻松的开发自己的应用程序,并且不需要知道函数内部实现的细节。
图6ALSA体系结构图[11]
使用ALSA来播放或者录音的主要步骤有三步:
1)打开音频设备,调用snd_pcm_open函数接口。
2)Hw参数的设置,调用snd_pcm_hw_param_set_xxx函数接口对Hw的对数进行设置。
3)Prepare操作,调用snd_pcm_prepare函数接口.
最后就可以把音频数据从设备里读出来(播放),或者将音频数据写到设备中去(录音)[12]。
3.2.3HTTP超文本传送协议
HTTP是超文本传送协议(HypertextTransferProtocol)的简称,是万维网(WorldWideWeb,简称WWW)的基础。
HTTP其实是一个简单的协议。
当客户进程建立了一条与服务器进程的TCP连接的时候,客户端会发出请求读取服务器进程的响应。
如果服务器关闭,则表示此次的响应直接结束。
服务器的进程返回的文件通常包含拽向其他服务器上的文件的指针,也就是超文本链接。
这样,用户就可以轻松的通过这些链接从一个服务器到达另一个服务器了[13].
HTTP的报文是一个简单的格式化文本。
每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应。
它们均由三个部分组成:
对报文进行描述的起始行(请求行)、包含属性的首部块以及可选的(报文头)、包含数据的主体部分。
报文的格式如下所示:
请求报文的格式:
〈method〉〈headers〉
〈entity—body>
响应报文的格式:
〈status>
报文格式的解释:
method(方法)
客户端希望服务器对资源执行的动作,如:
GET、HEAD、POST
request—URL(请求URL)
命令了所请求资源,或者URL路径组件的完整URL
version(版本)
报文所使用的HTTP版本,其格式为HTTP/其中major是主要版本号,minor是次要版本号,均为整数。
status(状态码)
状态码由三位数字组成,描述了在请求进程中发生的情况。
reason—phrease(原因短语)
上面的数字状态码的可读版本包含终止序列之前的所有文本。
headers(首部)
一条报文中可以有0个或者多个首部,每一个首部都包含一个名字,后面跟着一个冒号,然后是一个可选的空格,接着是一个值,最后是一个(CRLF)。
首部由一个空行(CRLF)结束的,表示首部列表的结束和实体主体部分的开始.
entity—body(实体的主体部分)
包含一个人数据组成的数据块.但是并不是所有的报文都有实体的主体部分.有时报文仅仅以一个CRLF结束。
本次设计的设计注重的是实际需求,并不是要解析所有的HTTP协议的要素。
由于数据量较大,所以要尽量减少不必要的处理[14]。
3.3驱动安装及编译错误解决办法
在进行音视频开发的时候,必须依赖第三方的库,如果没有这些库,就算你将代码完成了,在编译的时候,Qt会报错,某些函数未定义的使用等错误。
这时,我们就要自己手动去安装这些库。
第一个是jpeg库,因为摄像头有的不支持v4l2_pix_fmt_mjpeg格式,只能支持v4l2_pix_fmt_yuyv格式,这样的话不适于网络传输。
为了将YUYV转换成MJPEG,只能借助于jpeg库.我们可以去http:
//www.ijg.org/files/jpegsrc。
v8b.tar。
gz下载jpeg源码包,然后通过以下方式来安装:
$解压包tarxzvfjpegsrc。
v8b。
tar.gz
$cdjpeg-8b
$。
/configure–prefix=/usr/local/jpeg
$make
$makeinstall
第二个是alsa库,可以去alsa官网http:
//www。
alsa-project.org/去下载库包,并按步骤安装即可。
第三个是asla开发的头文件,在内核中找不到alsa/asoundlib。
h这个文件,这时我们要打开linux终端,输入apt-get-installlibasound2—dev即可。
如果这三个都安装完成,那么,我们就可以放心的进行该软件的开发了。
4详细设计
4.1本次设计的研究目的
C++是一种通用的程序设计语言,它是C程序设计语言的一个超集。
C++提供了C所提供的所有功能,还为定义新类型提供了灵活有效的功能[15].C++中类是一个重要的概念,一个类就是一个用户定义的类型.C++的类为C++提供了比C好得多的功能。
另外C++还保持了C高效的处理硬件对象的能力,使得用户定义的类型能够在相当高的效率水平是实现。
Qt是基于C++的软件设计工具,它具有“一次编写,随处编译"[16]的特点。
通过本次设计,可以进一步熟悉Qt编译环境的搭建和配置,掌握Qt的图形界面的设计、多线程编程、信号与槽的使用、网络输入输出、文件操作等。
通过亲自动手写这样一个程序可以扩展知识面,提高自己的编程和调试程序的能力。
4。
2本次设计的运行环境
硬件要求能运行Linux操作系统,C++程序设计语言的gcc编译环境,QtCreator开发开具。
4。
3类、方法、属性说明
4。
3.1类的设计
在设计该视频聊天工具的时,程序主要由以下5个部分组成:
第一部分:
登录界面部分(Widget)定义了用户登录的窗口。
第二部分:
主界面部分(MainInterface)定义了主界面的背景绘制的方法,用户头像部件,好友列表部件以及窗口拖动以及缩放的算法等.
第三部分:
聊天界面部分(ChatInterface)定义了聊天背景会制的方法,以及开启音视频聊天相应的功能按键。
第四部分:
视频聊天界面部分(Screen)定义了初始化背景方法,视频传输与接收的线程,音频传输与接收的线程以及结束视频聊天的按键等。
第五部分:
音频聊天部分(Audio)定义了语音聊天记时的方法以及结束语音聊天的按键.
4.3.2成员变量的设计
C++中的成员变量就是指类中定义的变量。
成员变量有它的属性,由类中的public,protect和private关键字分别定义为公有的,受保护的和私有的三种属性。
只有公有的属性的成员变量才可以直接被其他类使用,而外部类也可以通过该类的成员函数来访问它的私有属性[17]。
通过private关键字,可以保护一些数据的安全.由于本次设计中涉及的成员变量太多,全文我都以登录界面(Widget)的设计来举例。
4.3。
3成员函数的设计
成员函数也就是类中定义函数,可以设计成可以被外部类调用(即公有),也可以设计成不能被外部类使用(即私有)。
void表示没有返回值,函数参数是调用时给予的声明,两个参数以上要用逗号隔开。
若没有参数,则参数行为空。
注意:
一个方法不能在中一个方法内声明。
表1成员函数
方法名
功能
备注
pintEvent(QPaintEvent*event)
绘制登录界面背景
当类被实例化时,调用此方法,完成背景的绘制
mousePressEvent(QMouseEvent*)
鼠标被按下时实现相应的功能
当鼠标被按下时,调用此方法
mouseMoveEvent(QMouseEvent*)
鼠标移动时实现相应功能
当鼠标在界面上移动时,调用此方法
keyPressEvent(QKeyEvent*event)
键盘某个键被按下时实现相应的功能
当键盘上有键被按下时,调用此方法
4。
3。
4控件的设计
控件是QtCreator中已经封装好的方法和数据.通过控件,用户可以与之交互或者操作数据.
表2成员变量
控件说明
控件类型
控件名
文本
加载背景图片
QImage
loginImage
无
头像
HeadSculpture*
Head
无
IP地址输入的标签
QLabel*
ipLabel
IP地址
端口号输入的标签
QLabel*
portLabel
端口号
用户名输入的标签
QLabel*
nameLabel
用户名
IP地址输入的行编辑框
QLineEdit*
ipLineEdit
127.0.0。
1
端口号输入的行编辑框
QlineEdit*
portLineEdit
10001
用户名输入的行编辑框
Q