多媒体聊天室_第1页
多媒体聊天室_第2页
多媒体聊天室_第3页
多媒体聊天室_第4页
多媒体聊天室_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 网络聊天室网络聊天室摘摘 要要视频聊天系统作为一种新型的通信和交流工具,突破了地域的限制,可以提供更为便捷、灵活、全面的音、视频信息的传递和服务,具有极其广泛的发展前景。本文介绍了采用 Microsoft Visual C+ 6.0 编程开发视频聊天系统的一套比较常用的解决方案。文字聊天采用 TCP 模式;语音视频聊天采用 UDP 模式,在客户端之间点对点的进行。在该方案中,通过函数库 VFW 来实现视频捕获、影像压缩以及影像播放。微软公司提供的专门用于视频捕获开发的工具包VFW,为在 Windows 操作系统中实现视频捕获提供了标准的接口,从而大大降低了程序的开发难度。在视频传输方面,则通

2、过组建视频帧,将位图形式的视频帧压缩成帧格式的 Mpeg4 流,传输到客户端后,解压并显示影像。同时,在本方案中,采用了线程来实现语音录制和语音回放,最终实现了通过服务器中转的文字聊天、点对点的语音视频聊天。关键词关键词:文字聊天;VFW;视频捕获;视频传输;语音录制;语音回放目目 录录1引言.11.1课题背景.11.2国内外研究现状.12理论知识介绍.12.1VFW 简介.12.2线程的实现方法.43需求分析.53.1软硬件环境.53.2需求分析.54系统结构.74.1硬件结构.74.2软件结构.74.2.1功能需求.74.2.2系统功能模块图.84.3系统各模块流程图.85系统的详细设计.

3、105.1文字聊天.105.1.1TCP 套接字的运用.105.1.2文字聊天实现.115.2语音视频聊天.135.2.1UDP 套接字的运用.135.2.2视频的捕获.145.2.3捕获窗口.165.2.4视频捕获驱动.185.2.5语音录制.185.2.6语音回放.195.2.7视音频的传输.201 1 引言引言1.11.1 课题背景课题背景随着 Internet 的不断发展普及,网络通讯越来越被千家万户所接受,成为人们生活中的一部分。网络聊天已和手机等一样,成为人们运用最为广泛的通信工具之一。本毕业设计的目的主要是为了满足人们通讯交流的便捷,实现灵活、全面的音、视频信息的传递和服务。模拟

4、腾讯公司的 QQ 聊天软件,开发一个多功能的聊天系统软件,本毕业设计主要实现视频语音聊天、文字聊天等功能。1.21.2 国内外研究现状国内外研究现状随着网络宽带业务的推广与普及,加之视频产品设备(如摄像头、耳机、麦克风等)的成熟,普通用户可以轻松地借助网络视频通讯软件,实现“面对面”的网络交流。信息的无限量扩大,交通工具的便捷,视频技术的充分应用等导致了行业间竞争的全球化,这就要求现代部门、企业要具备更加灵敏的神经,更扁平化的管理,更快速的反应和决策,更贴切的市场宣传和服务。所有这一切是由信息技术的发展所带来的,同样也要求有先进的信息技术来提高部门、企业的竞争力。现代通讯已经是越来越普及了,必

5、须有效合理的运用视频产品类设备来提高信息的传递和交流。在同一个局域网中,充分、合理的运用摄像头、耳机、麦克风等设备来实现文字聊天和语音视频聊天更是我们生活、学习、工作的便利所在。2 2 理论知识介绍理论知识介绍2.12.1 VFWVFW 简介简介VFW 是 Microsoft 1992 年推出的关于数字视频的一个软件包,它能使应用程序数字化并播放从传统模拟视频源得到的视频剪辑。VFW 的一个关键思想是播放时不需要专用硬件,为了解决数字视频数据量大的问题,需要对数据进行压缩。它引进了一种叫 AVI 的文件标准,该标准未规定如何对视频进行捕获、压缩及播放,仅规定视频和音频该如何存储在硬盘上,以及在

6、 AVI 文件中交替存储视频帧和与之相匹配的音频数据。VFW 给程序员提供 VBX 和 AVICap 窗口类的高级编程工具,使程序员能通过发送消息或设置属性来捕获、播放和编辑视频剪辑。用户不必专门安装 VFW,在安装 Windows 时,安装程序会自动地安装配置视频所需的组件,如设备驱动程序、视频压缩程序等。VFW 主要由以下六个模块组成:(1) AVICAP.DLL:包含了执行视频捕获的函数,它给 AVI 文件、I/O 和视频音频设备驱动程序提供一个高级接口;(2) MSVIDEO.DLL:用一套特殊的 DrawDib 函数来处理屏幕上的视频操作;(3) MCIAVI.DRV:此驱动程序包括

7、对 VFW 的 MCI 命令的解释器;(4) AVIFILE.DLL:支持由标准多媒体 I/O(mmio)函数提供的更高的命令来访问 AVI 文件;(5) 压缩管理器(ICM):管理用于视频压缩/解压缩的编解码器(CODEC) ;(6) 音频压缩管理器 ACM:提供与 ICM 相似的服务,不同的是它适于波形音频。Visual C+在支持 VFW 方面提供有 vfw32.lib、msacm32.lib、winmm.lib等库。特别是它提供了功能强大、简单易行、类似于 MCIWnd 的窗口类AVICap。AVICap 为应用程序提供了一个简单的、基于消息的接口,使之能访问视频和波形音频硬件,并能在

8、将视频流捕获到硬盘上的过程中进行控制。AVICap 支持实时的视频流捕获和单帧捕获,并提供对视频源的控制。虽然MCI 也提供数字视频服务,比如,它为显示 AVI 文件的视频提供了 AVIVideo 命令集,为视频叠加提供了 overlay 命令集,但这些命令主要是基于文件的操作,不能满足实时地直接从视频缓存中获取数据的要求。对于使用没有视频叠加能力的捕获卡的 PC 机来说,用 MCI 提供的命令集是无法捕获视频流的。而AVICap 在捕获视频方面具有一定的优势,它能直接访问视频缓冲区,不需要生成中间文件,实时性很强,效率很高。同时,它也可将数字视频捕获到文件。在视频捕获之前需要创建一个捕获窗,

9、所有的捕获操作及其设置都以它为基础。用 AVICap 窗口类创建的窗口(通过 capCreateCaptureWindow 函数创建)被称为“捕获窗” ,其窗口风格一般为 WS_CHILD 和 WS_VISIBLE。实际上,捕获窗类似于标准控制(如按钮、列表框等) 。捕获窗具有下列功能:(1) 将视频流和音频流捕获到一个 AVI 文件中;(2) 动态地同视频和音频输入器件连接或断开;(3) 以 Overlay 或 Preview 模式对输入的视频流进行实时显示;(4) 在捕获时可指定所用的文件名并能将捕获文件的内容拷贝到另一个文件;(5) 设置捕获速率;(6) 显示控制视频源、视频格式、视频压

10、缩的对话框;(7) 创建、保存或载入调色板;(8) 将图像和相关的调色板拷贝到剪贴板;(9) 将捕获的一个单帧图像保存为 DIB 格式的文件。AVICap 在显示视频时提供的两种模式:(A)预览(Preview)模式:该模式使用 CPU 资源,视频帧先从捕获硬件传到系统内存,接着采用 GDI 函数在捕获窗中显示。在物理上,这种模式需要通过 VGA 卡在监视器上显示。(B)叠加(Overlay)模式:该模式使用硬件叠加进行视频显示,叠加视频的显示不经过 VGA 卡,叠加视频的硬件将 VGA 的输出信号与其自身的输出信号合并,形成组合信号显示在计算机的监视器上。只有部分视频捕获卡才具有视频叠加能力

11、。灵活编写 AVICap 提供的回调函数还可满足一些特殊需求。比如,将宏capCaptureSequenceNoFile 同用 capSetCallbackOnVideoStream 登记的回调函数一起使用,可使应用程序直接使用视频和音频数据。在视频聊天的应用程序中可利用这一点来获得视频帧,回调函数将捕获的图像传到远端的计算机。应用程序可用捕获窗来登记回调函数(由用户编写,而由系统调用) ,以便在发生下列情况时,它能通知应用程序,作出相应的反应:捕获窗状态改变;出错;视频帧和音频缓存可以使用;在捕获过程中,其它应用程序处于让步(Yield)地位。视频捕获编程也要用到涉及视频捕获的结构、宏、消息

12、和函数。令人高兴的是,发送 AVICap 窗口消息所能完成的功能都能调用相应的宏来完成。例如,SendMessage(hWndCap,WM_CAP_DRIVER_CONNECT,0,0L)与capDriverConnect(hWndCap,0)的作用相同,都是将创建的捕获窗同视频输入器件连接起来。视频部分主要是利用 Video Capture 函数库来获取影像的。Video Capture主要提供下列功能:连接驱动程序;获取影像、声音资料,并显示在屏幕上或者是存成 AVI 文件;获取单张影像显示在屏幕上,拷贝至剪贴簿,或者是存成DIB(Device-Independent Bitmap)文件。

13、Video Capture 的主要结构:结构体 CAPTUREPARAMS 主要包含一些获取图像的参数:DWORD dwRequestMicroSecPerFrame 代表相邻两个 frame 的获取时间间隔;BOOL fYield 值为 TRUE,则表示 Windows 会以另一个 thread 来捕获影像,值为FALSE,程序会在捕捉影像后显示忙碌状态;BOOL fCaptureAudio 其值表示是否需要同时获取声音资料。结构体 BITMAPINFO 和点阵图有关,主要定义了影像获取之后显示在屏幕上、存储在文件中的格式,它包含两个成员:BITMAPINFOHEADER bmiHeader

14、 描述影像性质的结构,其成员记载了影像的大小、颜色深度和压缩的方式,该成员在Video Capture、Video Compression Manager 和 DrawDib 函数库中,以及有关于点阵图的应用中;RGBQUAD bmiColors 指向 color table 第一个元素的位置。结构体 COMPVARS 主要是记录所有和压缩相关的信息,重要的成员:DWORD fccHandler 为 compressor 句柄;LPBITMAPINFO lpbiIn 指向待压缩影像BITMAPINFO 的指标;LPBITMAPINFO lpbitOut:指向压缩完影像 BITMAPINFO 的

15、指标;LONG lKey 代表 key-frame rate,而所谓 key frame 是指此 frame 在解压缩时不需要依赖前面的 frame;LONG lQ 代表影像压缩后的品质,取值为110000 的整数。Video Compression Functions 主要记录压缩功能相关的信息,其包含的比较重要的成员:ICLocate 输入指向压缩前后 BITMAPINFO 的指标,以及欲使用的 codecs;ICCompressorChoose 呼叫一个系统内建的对话,其中包含所有可能使用的 codes 以及其相关参数;ICCompressQuery 询问 compressor 是否支持

16、某种压缩方式,输入参数为 compressor handle 及指向压缩前后 BITMAPINFO 的指标,此函数会传回询问结果;ICCompressBegin 要求系统准备相关资源以供压缩之用;ICCompress 压缩某个 frame;ICCompressEnd 归还相关资源给系统;ICDompressQuery 询问 decompressor 是否支持某种解压缩方式;ICDompressBegin 要求系统准备相关资源以供解压缩之用;ICDompress 解压缩某一个 frame;ICDompressEnd 归还相关资源给系统;ICDompressFree 归还COMPVARS 所占用的

17、资源。2.22.2 线程的实现方法线程的实现方法线程是一个独立的执行流,是进程内部的一个独立的执行单元,相当于一个子程序,它对应于 Visual C+中的 CWinThread 类对象。单独一个执行程序运行时,缺省地包含了一个主线程,主线程以函数地址的形式出现,提供程序的启动点,当主线程终止时,进程也随之终止。根据实际需要,应用程序可以分解成许多独立执行的线程,每个线程并行的运行在同一进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,使用该进程的全局变量和系统资源。操作系统给每个线程分配不同的 CPU 时间片,在某一个时刻,CPU 只执行一个时间片内的线程,多个时间片中的相应线程在 CP

18、U 内轮流执行,由于每个时间片时间很短,所以对用户来说,仿佛各个线程在计算机中是并行处理的。操作系统是根据线程的优先级来安排 CPU 的时间,优先级高的线程优先运行,优先级低的线程则继续等待。Windows 提供了两种线程:用户界面线程和工作线程(又称为后台线程) 。用户界面线程通常用来处理用户的输入并响应各种事件和消息,其实,应用程序的主执行线程 CWinApp 对象就是一个用户界面线程,当应用程序启动时自动创建和启动,同样它的终止也意味着该程序的结束,进程终止。工作线程用来执行程序的后台处理任务,比如计算、调度、对串口的读写操作等,它和用户界面线程的区别是它不用从 CWinThread 类

19、派生来创建,对它来说最重要的是如何实现工作线程任务的运行控制函数。工作线程和用户界面线程启动时要调用同一个函数的不同版本;一个进程中的所有线程共享它们父进程的变量,但同时每个线程可以拥有自己的变量。这里主要介绍用户界面线程的运用:(1) 线程的启动创建一个用户界面线程,首先要从类 CwinThread 产生一个派生类,同时必须使 DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE 来声明和实现这个CwinThread 派生类。第二步是根据需要重载该派生类的一些成员函数如:ExitInstance() 、InitInstance() 、OnIdle() 、PreTra

20、nslateMessage()等函数。最后调用 AfxBeginThread()函数的一个版本:CWinThread* AfxBeginThread (CRuntimeClass* pThreadClass,int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL)启动该用户界面线程,其中第一个参数为指向定义的用户界面线程类指针变量,第二个参数为线程的优先级,第三个参数为线程所对应的堆栈大小,

21、第四个参数为线程创建时的附加标志,缺省为正常状态,如为 CREATE_SUSPENDED 则线程启动后为挂起状态。(2) 线程的优先级CwinThread 类的成员函数用于线程优先级的操作:int GetThreadPriority() ;BOOL SetThradPriority()(int nPriority);(3) 线程的挂起和恢复CWinThread 类中包含了应用程序挂起和恢复它所创建的线程的函数,其中SuspendThread()用来挂起线程,暂停线程的执行;ResumeThread()用来恢复线程的执行。如果你对一个线程连续若干次执行 SuspendThread() ,则需要连

22、续执行相应次的 ResumeThread()来恢复线程的运行。(4) 结束线程终止线程有三种途径,线程可以在自身内部调用 AfxEndThread()来终止自身的运行;可以在线程的外部调用 BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode)来强行终止一个线程的运行,然后调用 CloseHandle()函数释放线程所占用的堆栈;第三种方法是改变全局变量,使线程的执行函数返回,则该线程终止。3 3 需求分析需求分析3.13.1 软硬件环境软硬件环境电脑两台以上,分别配有摄像头、麦克风、音箱或耳机等外部设备;Windows XP 系统,Mic

23、rosoft Visual Studio 6.0 编程开发系统等。3.23.2 需求分析需求分析在同一个局域网中,如何根据自身业务的要求,量身定制,对视频设备进行合理搭配,选择一套合理的视频聊天室系统。如何来满足局域网内部用户的通讯要求,在考虑到网络带宽的同时,提高视频清晰度,动态画面的流畅,语音的实时传输等,正是现代社会通讯所必需的。设计本系统时,分析网络承载、整个系统结构的组建等是实现局域网文字聊天和语音视频聊天所必需的。文字、语音视频聊天作为一种广泛的网络应用对其基础的承载网络环境有着较高的网络要求。其中应重点考虑的是网络的带宽情况、端到端的时延、时延抖动、丢包率等问题。(1) 网络带宽

24、需求,视频聊天对网络的带宽需求为“视频带宽+IP 包头开销” ,计算方法为:网络带宽 = 视频带宽 1.2。(2) 端到端的时延,网络传输不可避免的会发生传输时延,通常建议视频聊天的通用时延小于 150ms。(3) 时延抖动,由于音频/视频的传输为实时的交互,因此网络的时延抖动更为重要,一般,视频聊天的时延抖动控制在 50ms 内。(4) 丢包率,网络数据传输经常会出现丢包现象,视频传输过程中数据丢包严重的话会影响在线视频聊天质量。因此,在设计上应将网络上的丢包率控制在 1%以内。视频聊天对实时性要求较高的网络应用,作为其基础的承载网络有较高的宽带和对网络中的业务流量有较高的控制能力。而视频聊

25、天系统本身对带宽的要求为 62kbit/s2Mbit/s,但是为了满足流畅的视音频效果,要求带宽不低于384kbit/s。文字、视频聊天的功能和应用效果体现在客户端,而服务器端则是必不可少的,对于系统的需求分析在系统设计的过程中应该明确、细致:(1) 文字聊天:首先启动服务器端,当用户启动客户端时,用服务器保存的用户名和密码来验证客户是否已经登录到服务器。只有当有两个以上的用户启动客户端时,才可以进行文字聊天,聊天内容要经过服务器中转,分别在服务器端和两个聊天的客户端显示聊天。(2) 语音视频聊天:在有两个客户在线的情况下,才能进行语音视频聊天。两个用户要进行语音视频聊天时,一个用户选中另一个

26、用户的用户名,根据该用户名在后台链表中的对应 IP 地址查找用户并请求视频连接。当双方确认视频连接后就进行视频传输,并显示在客户端,同时用线程实现语音录制和回放。这样,两个用户就实现了点对点的语音视频聊天。在进行语音视频聊天的过程中,不能再与其它用户进行语音视频聊天,但能够与其它用户进行文字聊天。4 4 系统结构系统结构4.14.1 硬件结构硬件结构该系统采用的是 Server/Client 结构,服务器端是一台 PC 机,而客户端是PC 机和一个数字摄像头、耳机和麦克风。它们进行文字聊天时,要经过服务器进行中转,而当进行语音视频聊天时是客户端与客户端之间直接进行的点对点的连接,它们之间的网络

27、拓扑结构如图 1。在图中,为了简便,没有画出麦克风、音箱或耳机等外部设备。图 1 网络拓扑结构图4.24.2 软件结构软件结构4.2.14.2.1 功能需求功能需求通过需求调研并分析,确定系统具备的基本功能,包括:文字聊天、语音视频聊天。(1) 文字聊天:文字聊天采用的是 TCP 模式,包括服务器端和客户端。首先启动服务器端,客户端通过用户名和密码登录服务器,服务器响应客户端登录并提示有用户登录,此时两个用户就可以进行文字聊天,在文字聊天时通过服务器中转,而每个用户可以同时与多个用户进行文字聊天。当有用户退出时,服务器做出响应,提示在线用户,用户下线。(2) 语音视频聊天:语音视频聊天时采用的

28、是 UCP 模式,客户端与客户端点对点的进行,不需要经过服务器端中转。在文字聊天的基础上,客户端之间自行处理的语音视频聊天,运用 VFW 函数库中的函数对 USB 口输入的数字视频信息进行相关处理,比如:视频捕获、影像压缩以及影像播放等,同时利用线程来处理声音部分的录制、回放等。A 客户端向 B 客户端请求语音视频聊天是通过 B 客户端的用户名来获得 B 客户端的 IP 地址,并向 B 客户端发送语音视频聊天请求,当 B 客户端接受后捕获视频,并进行压缩传输到 A 客户端解压并进行显示,在 B 客户端接受视频的同时,A 客户端也捕获视频,压缩传输到 B 客户端解压并进行显示。4.2.24.2.

29、2 系统功能模块图系统功能模块图该系统分为服务器端和客户端,完成了文字聊天和语音视频聊天,使用上只有文字聊天时才会通过服务器端,而对于语音视频聊天就只需要对整个在线客户端两两之间进行点对点的视频聊天。而在语音视频时包括了视频捕获、视频压缩、解压缩、语音录制、语音回放以及视频传输等。整个系统的功能模块图如图 2。基基于于局局域域网网的的视视频频聊聊天天室室系系统统语语音音视视频频聊聊天天视视频频捕捕获获视视频频压压缩缩、解解压压缩缩视视频频传传输输服服务务器器中中转转语语音音录录制制语语音音回回放放文文字字聊聊天天图 2 系统功能模块图4.34.3 系统各模块流程图系统各模块流程图在整个系统中主

30、要运行两个功能:图 3 文字聊天流程图和图 4 语音视频聊天流程图。图 3 文字聊天流程图图 4 语音视频聊天流程图5 5 系统的详细设计系统的详细设计5.15.1 文字聊天文字聊天5.1.15.1.1 TCPTCP 套接字的运用套接字的运用在文字聊天时,服务器端与客户端的连接是采用的 TCP 套接节进行连接。TCP 套接字的使用如图 5。创建 CSocket 对象 CSocketServer 来处理服务器端与客户端的连接,CSocket 继承于 CasyncSocket,是 Windows Socket API 的高层抽象。CSocket 通常和 CsocketFile 以及 Carchiv

31、e 类混合使用,这两个类负责数据的发送和接收。要使用 CSocket 对象,首先要调用构造函数,然后调用Create 函数创建一个 Socket 句柄。CSocket 函数缺省是创建一个流 Socket;如果没有使用 CArchive 类,那么还可以创建一个数据报 Socket。服务器端调用 Accept,客户端调用 Connect,然后创建一个 CsocketFile 去关联CSocket。接下来的操作可以创建 CArchive 对象关联 CsocketFile,以用来发送和接收数据。图 5 TCP 套接字的使用5.1.25.1.2 文字聊天实现文字聊天实现ChatServer 服务器运行时

32、,利用一个 CSocket 对象 CSocketServer 启动服务器,用函数 gethostname 来获得服务器端主机名和 IP,同时在服务器对话框中显示服务器 IP,并将分配的固定端口号 8123 显示在对话框中。用一个 list列表显示在线用户,随时更新用户登录情况,用一个 edit box 显示客户端的聊天内容以及系统提示消息。每一个 ChatClient 客户端启动时,利用服务器内定的用户号和密码来登录(如图 6)。在整个系统中,利用链表来处理所有的用户信息:当有用户登录时,在链表尾部加入该用户信息;当用户下线时,在该链表中删除用户,并提示所有用户,该用户下线。在对链表进行操作的

33、同时,要更新 list 列表中的信息。图 6 用户登录界面ChatServer 服务器端响应客户端文字聊天时的中转情况如图 7。图 7 服务器响应文字聊天信息中转ChatClient 客户端两两间进行文字聊天时,发送信息的处理函数如下:void CChatClientDlg:OnChatBtSend() /发送信息按键if( !m_bConnect)SetMessageBox(请连接服务器!rn);return ;CString str;CString szUserName;CMesg msg;GetDlgItemText(IDC_MESSAGE,str);GetDlgItemText(IDC

34、_USERNAME,szUserName);if( str.GetLength() = 0 )SetMessageBox(请输入想要发送的信息!rn);return ;if ( szUserName.GetLength() SendM(&msg);AddReceiver(szUserName , true);AddChatMessage(str);在聊天两个客户端的信息情况如图 8 和图 9。图 8 接收文字信息图 9 发送文字信息5.25.2 语音视频聊天语音视频聊天5.2.15.2.1 UDPUDP 套接字的运用套接字的运用在实现语音视频聊天时,采用的是基于 UDP 套接字的点对点

35、模式,而 UDP 面向的是无连接的数据服务,其套接字的使用如图 10 所示。图 10 UDP 套接字的使用5.2.25.2.2 视频的捕获视频的捕获利用 VFW 接口,视频捕获可以分为以下几个步骤:(1) 建立视频采集窗口:该窗口用来接收视频捕捉驱动程序传来的数据和消息。(2) 连接视频驱动程序:将建立的视频捕捉窗口与视频设备驱动程序相连。(3) 视频捕获初始化。(4) 视频捕捉设置:VFW 下视频捕捉参数的设置可以通过调用函数或弹出对话框的形式来实现。一般视频驱动程序允许设置的参数包括视频源选择、视频格式、视频显示格式等。(5) 设置回调函数:通过回调函数来通知程序视频事件的发生,比如捕捉一

36、帧图像成功的消息,捕捉出错的消息等。(6) 结束捕捉:结束捕捉是应该有一些清除工作。如释放分配的内存,断开捕捉窗口与视频捕捉驱动程序的连接,清除视频捕捉窗口等。窗口类为捕获数字视频流及其相关操作提供了很大的方便,灵活编写其中的回调函数可满足实时视频传输的需要,例如应用程序可直接从缓冲中取得数字视频并对其进行压缩编码后实时地传到远端的客户端。在 VC+中,采用 VFW 技术,客户端通过 capSetCallbackOnFrame()注册回调函数,当采集卡采集到一幅图像后,系统就会自动调用回调函数,然后再回调函数中使用 ICSeqCompressFrame()函数进行压缩。然后再通过 Winsoc

37、k 将压缩后的数据发送到另一客户端。该客户端接收完一帧以后,交给ICDecompress()解压,最后用 SetDIBitsToDevice()将图像显示出来。基本的捕获设置包括设置捕获速度(每秒捕获多少帧) 、是否同时捕获声频、捕获缓冲、允许最大丢失多少帧和是否使用 DOS 内存,以及使用键盘的哪个键或鼠标的哪个键来终止捕获等内容,这些设置使用 CAPTUREPARAMS 结构来描述,capCaptureGetSetup 宏来得到当前的设置,然后改变此结构的成员变量,再使用 capCaptureSetSetup 宏设置新的设置。设置捕获速度,通过使用 capCaptureGetSetup 宏

38、来得到当前的捕捉速度,将当前的捕捉速度保存在 CAPTUREPARAMS 结构的 dwRequestMicroSecPerFrame成员变量中,也可以通过设置此变量来改变当前设置值。设置终止捕获,同样通过使用 capCaptureGetSetup 宏来得到当前的设置,当前按键设置保存在 CAPTUREPARAMS 结构的 vKeyAbort 成员中,鼠标设置保存在 fAbortLeftMouse 和 fAbortRightMouse 成员中,通过修改可以设置新的热健或者鼠标左右键,修改完成后,使用 capCaptureSetSetup 宏来进行更新。捕获的时间限制,用 CAPTUREPARAM

39、S 结构中的 fLimitEnabled 表示捕获是否有时间的限制,wTimeLimit 用来设置指示捕获最大的持续时间,其单位为秒。使用 capCaptureGetSetup 宏来得到当前的设置值。下面程序为设置 CAPTUREPARAMS 结构的实现代码:BOOL VideoCapture:SetCapturePara()CAPTUREPARMS CapParms=0;capCaptureGetSetup(m_capwnd,&CapParms,sizeof(CapParms);/得到当前的捕获速度CapParms.fAbortLeftMouse = FALSE;CapParms.f

40、AbortRightMouse = FALSE;CapParms.fYield = TRUE;CapParms.fCaptureAudio = FALSE;CapParms.wPercentDropForError = 80;if(!capCaptureSetSetup(m_capwnd,&CapParms,sizeof(CapParms)/log.WriteString(n Failed to set the capture parameters );return FALSE;/ Set Video Format capGetVideoFormat(m_capwnd,&m_b

41、mpinfo,sizeof(m_bmpinfo);m_bmpinfo.bmiHeader.biWidth=IMAGE_WIDTH;m_bmpinfo.bmiHeader.biHeight=IMAGE_HEIGHT;BOOL ret=capSetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo);/log.WriteString(n Video parameters set properly);return ret;/终止一个捕获任务BOOL VideoCapture:StopCapture()capCaptureStop(m_capwnd

42、);capCaptureAbort(m_capwnd);Sleep(500); return TRUE;5.2.35.2.3 捕获窗口捕获窗口在捕获前必须创建一个捕获窗口(Capture Widnow) ,下面介绍有关捕获窗口的情况:创建一个 AVICap 捕获窗口,用 capCreateCaptureWindow 函数并返回一个句柄。将捕获窗口连接至捕获设备,用 capDriverConnect 函数来使一个捕获窗口与一个捕获设备连接或关联连接上后,就可以通过捕获窗口向捕获设备发送各种消息,可以使用函数 capGetDriverDescription 来获得已安装的捕获设备名称及版本,将其列

43、举在实现程序过程中。再利用 capDriverGetName 函数来得到捕获设备的名称将获得的版本发送到 capDriverGetVersion。如果断开捕获窗口与捕获设备的连接用 capDriverDisconnect。捕获窗口的状态,用 capGetStatus 函数来获得当前捕获窗口的状态,得到一个 CAPSTATUS 结构的拷贝。该结构的内容包含了图片的尺寸、卷轴的当前位置、overlay 和 preview 是否已设置。由于其信息是动态的,每当捕获的视频流的尺寸发生改变,程序应该在获取捕获设备的视频格式以后及时进行刷新。而捕获窗口尺寸的改变并不影响实际的捕获视频流的尺寸。该尺寸由视频

44、捕获设备的格式和视频对话框决定。/捕获窗口BOOL VideoCapture:Initialize() char devname128=0,devversion128=0; int index=0; BOOL ret = TRUE, ret1 = TRUE, ret2 = TRUE, ret3 = TRUE; TRACE(VideoCapture:Initializen); /创建一个 AVICap 捕获窗口 m_capwnd = capCreateCaptureWindow(Capture,WS_POPUP,0,0,1,1,0,0);if(!m_capwnd)return FALSE;/co

45、nnect callback functionsret = capSetUserData(m_capwnd,this);/Change destroy functions also. ret1 = capSetCallbackOnVideoStream(m_capwnd,OnCaptureVideo); /得到已安装的捕获设备的名称及版本 ret2 = capGetDriverDescription(index,devname,100,devversion,100);/ Connect to webcam driver/使一个捕获窗口与一个捕获设备连接或关联ret3 = capDriverCo

46、nnect(m_capwnd,index);if(!(ret & ret1 & ret2 & ret3)/ Device may be open already or it may not have been/ closed properly last time.AfxMessageBox(Unable to open Video Capture Device);/log.WriteString(n Unable to connect driver to the window);m_capwnd=NULL;return FALSE;/ Set the capture p

47、arametersif(SetCapturePara()=FALSE)/ log.WriteString(n Setting capture parameters failed); capDriverDisconnect(m_capwnd); /使捕获窗口与一个捕获设备断开 return FALSE;return TRUE;5.2.45.2.4 视频捕获驱动视频捕获驱动视频捕获必须具有视频捕获驱动才能进行,其相关内容如下:视频捕获驱动的性能,capDriverGetCap 函数得到当前连接视频驱动的硬件性能,该信息保存在 CAPDRIVERCAPS 结构中;视频对话框,每个视频驱动能够提供 4

48、 个对话框来控制视频捕获和数字化处理视频对话框定义的视频压缩率和图像品质等。视频对话框都在视频捕获驱动中定义。这个四个对话框分别为:Video Source 对话框用于控制选择视频来源(capDlgVideoSource) ;Video Format 对话框定义视频帧的尺寸和精度,以及视频捕获卡的压缩设置(capDlgVideoFormat);Video Display 对话框控制在视频捕获期间相关显示器上的显示(capDlgVideoDisplay);Video Compression 对话框控制压缩和图像品质(caoDlgVideoCompression)。5.2.55.2.5 语音录制语音录制在音频的录制和播放时,采用的用户界面线程来处理,是 CWinThread 对象,根据前面线程的介绍,一步一步的来实现。录音用的一个 CWinThread 对象CAudioRec 来实现,部分实现代码:LRESULT CAudioRec:OnStartRecording(WPARAM wp, LPARAM lp)if(recording)return FALSE;/打开录音设备MMRESULT mmReturn = :waveInOpen( &m_hRecord, WAVE_MAPPE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论