局域网聊天室系统.doc_第1页
局域网聊天室系统.doc_第2页
局域网聊天室系统.doc_第3页
局域网聊天室系统.doc_第4页
局域网聊天室系统.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

安阳师范学院本科学生毕业论文安阳师范学院本科学生毕业论文 局域网的视频聊天室系统局域网的视频聊天室系统 作作 者者 韩韩 啸啸 学学 院院 软件学院软件学院 专专 业业 软件工程 软件工程 NET NET 年年 级级 20102010 学学 号号 100906006100906006 指导老师指导老师 李俊峰李俊峰 论文成绩论文成绩 日日 期期 2014 5 2014 5 基于局域网的视频聊天室系统的设计与实现基于局域网的视频聊天室系统的设计与实现 摘摘 要要 视频聊天系统作为一种新型的通信和交流工具 突破了地域的限制 可以 提供更为便捷 灵活 全面的音 视频信息的传递和服务 具有极其广泛的发 展前景 本文介绍了采用 Microsoft Visual C 6 0 编程开发视频聊天系统的一套 比较常用的解决方案 文字聊天采用 TCP 模式 语音视频聊天采用 UDP 模式 在客户端之间点对点的进行 在该方案中 通过函数库 VFW 来实现视频捕获 影像压缩以及影像播放 微软公司提供的专门用于视频捕获开发的工具包 VFW 为在 Windows 操作系统中实现视频捕获提供了标准的接口 从而大大降低 了程序的开发难度 在视频传输方面 则通过组建视频帧 将位图形式的视频 帧压缩成帧格式的 Mpeg4 流 传输到客户端后 解压并显示影像 同时 在本 方案中 采用了线程来实现语音录制和语音回放 最终实现了通过服务器中转 的文字聊天 点对点的语音视频聊天 关键词关键词 文字聊天 VFW 视频捕获 视频传输 语音录制 语音回放 目目 录录 1引言 1 1 1课题背景 1 1 2国内外研究现状 1 2理论知识介绍 1 2 1VFW 简介 1 2 2线程的实现方法 4 3需求分析 6 3 1软硬件环境 6 3 2需求分析 6 4系统结构 8 4 1硬件结构 8 4 2软件结构 8 4 2 1功能需求 8 4 2 2系统功能模块图 9 4 3系统各模块流程图 9 5系统的详细设计 11 5 1文字聊天 11 5 1 1TCP 套接字的运用 11 5 1 2文字聊天实现 12 5 2语音视频聊天 15 5 2 1UDP 套接字的运用 15 5 2 2视频的捕获 16 5 2 3捕获窗口 19 5 2 4视频捕获驱动 20 5 2 5语音录制 21 5 2 6语音回放 22 5 2 7视音频的传输 23 结 论 24 参考文献 25 致 谢 26 第 1 页 共 26 页 1 1引言引言 1 11 1课题背景课题背景 随着 Internet 的不断发展普及 网络通讯越来越被千家万户所接受 成为 人们生活中的一部分 网络聊天已和手机等一样 成为人们运用最为广泛的通 信工具之一 本毕业设计的目的主要是为了满足人们通讯交流的便捷 实现灵 活 全面的音 视频信息的传递和服务 模拟腾讯公司的 QQ 聊天软件 开发一 个多功能的聊天系统软件 本毕业设计主要实现视频语音聊天 文字聊天等功 能 1 21 2国内外研究现状国内外研究现状 随着网络宽带业务的推广与普及 加之视频产品设备 如摄像头 耳机 麦克风等 的成熟 普通用户可以轻松地借助网络视频通讯软件 实现 面对 面 的网络交流 信息的无限量扩大 交通工具的便捷 视频技术的充分应用 等导致了行业间竞争的全球化 这就要求现代部门 企业要具备更加灵敏的神 经 更扁平化的管理 更快速的反应和决策 更贴切的市场宣传和服务 所有 这一切是由信息技术的发展所带来的 同样也要求有先进的信息技术来提高部 门 企业的竞争力 现代通讯已经是越来越普及了 必须有效合理的运用视频 产品类设备来提高信息的传递和交流 在同一个局域网中 充分 合理的运用 摄像头 耳机 麦克风等设备来实现文字聊天和语音视频聊天更是我们生活 学习 工作的便利所在 2 2理论知识介绍理论知识介绍 2 12 1VFWVFW 简介简介 VFW 是 Microsoft 1992 年推出的关于数字视频的一个软件包 它能使应用 程序数字化并播放从传统模拟视频源得到的视频剪辑 VFW 的一个关键思想是 播放时不需要专用硬件 为了解决数字视频数据量大的问题 需要对数据进行 压缩 它引进了一种叫 AVI 的文件标准 该标准未规定如何对视频进行捕获 压缩及播放 仅规定视频和音频该如何存储在硬盘上 以及在 AVI 文件中交替 存储视频帧和与之相匹配的音频数据 VFW 给程序员提供 VBX 和 AVICap 窗口类 的高级编程工具 使程序员能通过发送消息或设置属性来捕获 播放和编辑视 频剪辑 用户不必专门安装 VFW 在安装 Windows 时 安装程序会自动地安装 配置视频所需的组件 如设备驱动程序 视频压缩程序等 第 2 页 共 26 页 VFW 主要由以下六个模块组成 1 AVICAP DLL 包含了执行视频捕获的函数 它给 AVI 文件 I O 和 视频音频设备驱动程序提供一个高级接口 2 MSVIDEO DLL 用一套特殊的 DrawDib 函数来处理屏幕上的视频操 作 3 MCIAVI DRV 此驱动程序包括对 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 为应用程序提供了一个简单的 基于消息的接口 使之能访问 视频和波形音频硬件 并能在将视频流捕获到硬盘上的过程中进行控制 AVICap 支持实时的视频流捕获和单帧捕获 并提供对视频源的控制 虽然 MCI 也提供数字视频服务 比如 它为显示 AVI 文件的视频提供了 AVIVideo 命 令集 为视频叠加提供了 overlay 命令集 但这些命令主要是基于文件的操作 不能满足实时地直接从视频缓存中获取数据的要求 对于使用没有视频叠加能 力的捕获卡的 PC 机来说 用 MCI 提供的命令集是无法捕获视频流的 而 AVICap 在捕获视频方面具有一定的优势 它能直接访问视频缓冲区 不需要生 成中间文件 实时性很强 效率很高 同时 它也可将数字视频捕获到文件 在视频捕获之前需要创建一个捕获窗 所有的捕获操作及其设置都以它为 基础 用 AVICap 窗口类创建的窗口 通过 capCreateCaptureWindow 函数创建 被称为 捕获窗 其窗口风格一般为 WS CHILD 和 WS VISIBLE 实际上 捕获 窗类似于标准控制 如按钮 列表框等 捕获窗具有下列功能 1 将视频流和音频流捕获到一个 AVI 文件中 2 动态地同视频和音频输入器件连接或断开 第 3 页 共 26 页 3 以 Overlay 或 Preview 模式对输入的视频流进行实时显示 4 在捕获时可指定所用的文件名并能将捕获文件的内容拷贝到另一个 文件 5 设置捕获速率 6 显示控制视频源 视频格式 视频压缩的对话框 7 创建 保存或载入调色板 8 将图像和相关的调色板拷贝到剪贴板 9 将捕获的一个单帧图像保存为 DIB 格式的文件 AVICap 在显示视频时提供的两种模式 A 预览 Preview 模式 该模式使用 CPU 资源 视频帧先从捕获硬件 传到系统内存 接着采用 GDI 函数在捕获窗中显示 在物理上 这种模式需要 通过 VGA 卡在监视器上显示 B 叠加 Overlay 模式 该模式使用硬件叠加进行视频显示 叠加视 频的显示不经过 VGA 卡 叠加视频的硬件将 VGA 的输出信号与其自身的输出信 号合并 形成组合信号显示在计算机的监视器上 只有部分视频捕获卡才具有 视频叠加能力 灵活编写 AVICap 提供的回调函数还可满足一些特殊需求 比如 将宏 capCaptureSequenceNoFile 同用 capSetCallbackOnVideoStream 登记的回调函 数一起使用 可使应用程序直接使用视频和音频数据 在视频聊天的应用程序 中可利用这一点来获得视频帧 回调函数将捕获的图像传到远端的计算机 应 用程序可用捕获窗来登记回调函数 由用户编写 而由系统调用 以便在发生 下列情况时 它能通知应用程序 作出相应的反应 捕获窗状态改变 出错 视频帧和音频缓存可以使用 在捕获过程中 其它应用程序处于让步 Yield 地位 视频捕获编程也要用到涉及视频捕获的结构 宏 消息和函数 令人高兴 的是 发送 AVICap 窗口消息所能完成的功能都能调用相应的宏来完成 例如 SendMessage hWndCap WM CAP DRIVER CONNECT 0 0L 与 capDriverConnect hWndCap 0 的作用相同 都是将创建的捕获窗同视频输入 器件连接起来 第 4 页 共 26 页 视频部分主要是利用 Video Capture 函数库来获取影像的 Video Capture 主要提供下列功能 连接驱动程序 获取影像 声音资料 并显示在屏幕上或 者是存成 AVI 文件 获取单张影像显示在屏幕上 拷贝至剪贴簿 或者是存成 DIB Device Independent Bitmap 文件 Video Capture 的主要结构 结构体 CAPTUREPARAMS 主要包含一些获取图像的参数 DWORD dwRequestMicroSecPerFrame 代表相邻两个 frame 的获取时间间隔 BOOL fYield 值为 TRUE 则表示 Windows 会以另一个 thread 来捕获影像 值为 FALSE 程序会在捕捉影像后显示忙碌状态 BOOL fCaptureAudio 其值表示是 否需要同时获取声音资料 结构体 BITMAPINFO 和点阵图有关 主要定义了影像获取之后显示在屏幕上 存储在文件中的格式 它包含两个成员 BITMAPINFOHEADER bmiHeader 描述影 像性质的结构 其成员记载了影像的大小 颜色深度和压缩的方式 该成员在 Video Capture Video Compression Manager 和 DrawDib 函数库中 以及有关 于点阵图的应用中 RGBQUAD bmiColors 指向 color table 第一个元素的位置 结构体 COMPVARS 主要是记录所有和压缩相关的信息 重要的成员 DWORD fccHandler 为 compressor 句柄 LPBITMAPINFO lpbiIn 指向待压缩影像 BITMAPINFO 的指标 LPBITMAPINFO lpbitOut 指向压缩完影像 BITMAPINFO 的 指标 LONG lKey 代表 key frame rate 而所谓 key frame 是指此 frame 在解压 缩时不需要依赖前面的 frame LONG lQ 代表影像压缩后的品质 取值为 1 10000 的整数 Video Compression Functions 主要记录压缩功能相关的信息 其包含的 比较重要的成员 ICLocate 输入指向压缩前后 BITMAPINFO 的指标 以及欲使 用的 codecs ICCompressorChoose 呼叫一个系统内建的对话 其中包含所有可 能使用的 codes 以及其相关参数 ICCompressQuery 询问 compressor 是否支持 某种压缩方式 输入参数为 compressor handle 及指向压缩前后 BITMAPINFO 的 指标 此函数会传回询问结果 ICCompressBegin 要求系统准备相关资源以供 压缩之用 ICCompress 压缩某个 frame ICCompressEnd 归还相关资源给系统 第 5 页 共 26 页 ICDompressQuery 询问 decompressor 是否支持某种解压缩方式 ICDompressBegin 要求系统准备相关资源以供解压缩之用 ICDompress 解压缩 某一个 frame ICDompressEnd 归还相关资源给系统 ICDompressFree 归还 COMPVARS 所占用的资源 2 22 2线程的实现方法线程的实现方法 线程是一个独立的执行流 是进程内部的一个独立的执行单元 相当于一 个子程序 它对应于 Visual C 中的 CWinThread 类对象 单独一个执行程序 运行时 缺省地包含了一个主线程 主线程以函数地址的形式出现 提供程序 的启动点 当主线程终止时 进程也随之终止 根据实际需要 应用程序可以分 解成许多独立执行的线程 每个线程并行的运行在同一进程中 一个进程中的所有线程都在该进程的虚拟地址空间中 使用该进程的全局 变量和系统资源 操作系统给每个线程分配不同的 CPU 时间片 在某一个时刻 CPU 只执行一个时间片内的线程 多个时间片中的相应线程在 CPU 内轮流执行 由于每个时间片时间很短 所以对用户来说 仿佛各个线程在计算机中是并行 处理的 操作系统是根据线程的优先级来安排 CPU 的时间 优先级高的线程优 先运行 优先级低的线程则继续等待 Windows 提供了两种线程 用户界面线程和工作线程 又称为后台线程 用户界面线程通常用来处理用户的输入并响应各种事件和消息 其实 应用程 序的主执行线程 CWinApp 对象就是一个用户界面线程 当应用程序启动时自动 创建和启动 同样它的终止也意味着该程序的结束 进程终止 工作线程用来 执行程序的后台处理任务 比如计算 调度 对串口的读写操作等 它和用户 界面线程的区别是它不用从 CWinThread 类派生来创建 对它来说最重要的是如 何实现工作线程任务的运行控制函数 工作线程和用户界面线程启动时要调用 同一个函数的不同版本 一个进程中的所有线程共享它们父进程的变量 但同 时每个线程可以拥有自己的变量 这里主要介绍用户界面线程的运用 1 线程的启动 创建一个用户界面线程 首先要从类 CwinThread 产生一个派生类 同时必 须使 DECLARE DYNCREATE 和 IMPLEMENT DYNCREATE 来声明和实现这个 第 6 页 共 26 页 CwinThread 派生类 第二步是根据需要重载该派生类的一些成员函数如 ExitInstance InitInstance OnIdle PreTranslateMessage 等函数 最后调用 AfxBeginThread 函数的一个版本 CWinThread AfxBeginThread CRuntimeClass pThreadClass int nPriority THREAD PRIORITY NORMAL UINT nStackSize 0 DWORD dwCreateFlags 0 LPSECURITY ATTRIBUTES lpSecurityAttrs NULL 启动该用户界面线程 其中 第一个参数为指向定义的用户界面线程类指针变量 第二个参数为线程的优先 级 第三个参数为线程所对应的堆栈大小 第四个参数为线程创建时的附加标 志 缺省为正常状态 如为 CREATE SUSPENDED 则线程启动后为挂起状态 2 线程的优先级 CwinThread 类的成员函数用于线程优先级的操作 int GetThreadPriority BOOL SetThradPriority int nPriority 3 线程的挂起和恢复 CWinThread 类中包含了应用程序挂起和恢复它所创建的线程的函数 其中 SuspendThread 用来挂起线程 暂停线程的执行 ResumeThread 用来恢 复线程的执行 如果你对一个线程连续若干次执行 SuspendThread 则需要 连续执行相应次的 ResumeThread 来恢复线程的运行 4 结束线程 终止线程有三种途径 线程可以在自身内部调用 AfxEndThread 来终止自 身的运行 可以在线程的外部调用 BOOL TerminateThread HANDLE hThread DWORD dwExitCode 来强行终止一个线程的运行 然后调用 CloseHandle 函 数释放线程所占用的堆栈 第三种方法是改变全局变量 使线程的执行函数返 回 则该线程终止 3 3需求分析需求分析 3 13 1软硬件环境软硬件环境 电脑两台以上 分别配有摄像头 麦克风 音箱或耳机等外部设备 Windows XP 系统 Microsoft Visual Studio 6 0 编程开发系统等 第 7 页 共 26 页 3 23 2需求分析需求分析 在同一个局域网中 如何根据自身业务的要求 量身定制 对视频设备进 行合理搭配 选择一套合理的视频聊天室系统 如何来满足局域网内部用户的 通讯要求 在考虑到网络带宽的同时 提高视频清晰度 动态画面的流畅 语音 的实时传输等 正是现代社会通讯所必需的 设计本系统时 分析网络承载 整个系统结构的组建等是实现局域网文字聊天和语音视频聊天所必需的 文字 语音视频聊天作为一种广泛的网络应用对其基础的承载网络环境有 着较高的网络要求 其中应重点考虑的是网络的带宽情况 端到端的时延 时 延抖动 丢包率等问题 1 网络带宽需求 视频聊天对网络的带宽需求为 视频带宽 IP 包头开 销 计算方法为 网络带宽 视频带宽 1 2 2 端到端的时延 网络传输不可避免的会发生传输时延 通常建议视频 聊天的通用时延小于 150ms 3 时延抖动 由于音频 视频的传输为实时的交互 因此网络的时延抖 动更为重要 一般 视频聊天的时延抖动控制在 50ms 内 4 丢包率 网络数据传输经常会出现丢包现象 视频传输过程中数据丢 包严重的话会影响在线视频聊天质量 因此 在设计上应将网络上的丢包率控 制在 1 以内 视频聊天对实时性要求较高的网络应用 作为其基础的承载网络有较高的 宽带和对网络中的业务流量有较高的控制能力 而视频聊天系统本身对带宽的 要求为 62kbit s 2Mbit s 但是为了满足流畅的视音频效果 要求带宽不低于 384kbit s 文字 视频聊天的功能和应用效果体现在客户端 而服务器端则是必不可 少的 对于系统的需求分析在系统设计的过程中应该明确 细致 1 文字聊天 首先启动服务器端 当用户启动客户端时 用服务器保 存的用户名和密码来验证客户是否已经登录到服务器 只有当有两个以上的用 户启动客户端时 才可以进行文字聊天 聊天内容要经过服务器中转 分别在 服务器端和两个聊天的客户端显示聊天 2 语音视频聊天 在有两个客户在线的情况下 才能进行语音视频聊 第 8 页 共 26 页 天 两个用户要进行语音视频聊天时 一个用户选中另一个用户的用户名 根 据该用户名在后台链表中的对应 IP 地址查找用户并请求视频连接 当双方确认 视频连接后就进行视频传输 并显示在客户端 同时用线程实现语音录制和回 放 这样 两个用户就实现了点对点的语音视频聊天 在进行语音视频聊天的 过程中 不能再与其它用户进行语音视频聊天 但能够与其它用户进行文字聊 天 4 4系统结构系统结构 4 14 1硬件结构硬件结构 该系统采用的是 Server Client 结构 服务器端是一台 PC 机 而客户端是 PC 机和一个数字摄像头 耳机和麦克风 它们进行文字聊天时 要经过服务器 进行中转 而当进行语音视频聊天时是客户端与客户端之间直接进行的点对点 的连接 它们之间的网络拓扑结构如图 1 在图中 为了简便 没有画出麦克 风 音箱或耳机等外部设备 图 1 网络拓扑结构图 4 24 2软件结构软件结构 4 2 14 2 1 功能需求功能需求 通过需求调研并分析 确定系统具备的基本功能 包括 文字聊天 语音 视频聊天 1 文字聊天 第 9 页 共 26 页 文字聊天采用的是 TCP 模式 包括服务器端和客户端 首先启动服务器端 客户端通过用户名和密码登录服务器 服务器响应客户端登录并提示有用户登 录 此时两个用户就可以进行文字聊天 在文字聊天时通过服务器中转 而每 个用户可以同时与多个用户进行文字聊天 当有用户退出时 服务器做出响应 提示在线用户 用户下线 2 语音视频聊天 语音视频聊天时采用的是 UCP 模式 客户端与客户端点对点的进行 不需 要经过服务器端中转 在文字聊天的基础上 客户端之间自行处理的语音视频 聊天 运用 VFW 函数库中的函数对 USB 口输入的数字视频信息进行相关处理 比 如 视频捕获 影像压缩以及影像播放等 同时利用线程来处理声音部分的录制 回放等 A 客户端向 B 客户端请求语音视频聊天是通过 B 客户端的用户名来获 得 B 客户端的 IP 地址 并向 B 客户端发送语音视频聊天请求 当 B 客户端接受 后捕获视频 并进行压缩传输到 A 客户端解压并进行显示 在 B 客户端接受视 频的同时 A 客户端也捕获视频 压缩传输到 B 客户端解压并进行显示 4 2 24 2 2 系统功能模块图系统功能模块图 该系统分为服务器端和客户端 完成了文字聊天和语音视频聊天 使用上 只有文字聊天时才会通过服务器端 而对于语音视频聊天就只需要对整个在线 客户端两两之间进行点对点的视频聊天 而在语音视频时包括了视频捕获 视 频压缩 解压缩 语音录制 语音回放以及视频传输等 整个系统的功能模块 图如图 2 基基于于局局域域网网的的视视频频 聊聊天天室室系系统统 语语音音视视频频聊聊天天 视视频频捕捕获获 视视频频压压缩缩 解解压压缩缩 视视频频传传输输服服务务器器中中转转语语音音录录制制语语音音回回放放 文文字字聊聊天天 图 2 系统功能模块图 第 10 页 共 26 页 4 34 3系统各模块流程图系统各模块流程图 在整个系统中主要运行两个功能 图 3 文字聊天流程图和图 4 语音视频聊 天流程图 图 3 文字聊天流程图 第 11 页 共 26 页 图 4 语音视频聊天流程图 5 5系统的详细设计系统的详细设计 5 15 1文字聊天文字聊天 5 1 15 1 1 TCPTCP 套接字的运用套接字的运用 在文字聊天时 服务器端与客户端的连接是采用的 TCP 套接节进行连接 TCP 套接字的使用如图 5 创建 CSocket 对象 CSocketServer 来处理服务器端与 客户端的连接 CSocket 继承于 CasyncSocket 是 Windows Socket API 的高层 抽象 CSocket 通常和 CsocketFile 以及 Carchive 类混合使用 这两个类负责 数据的发送和接收 要使用 CSocket 对象 首先要调用构造函数 然后调用 Create 函数创建一个 Socket 句柄 CSocket 函数缺省是创建一个流 Socket 如果没有使用 CArchive 类 那么还可以创建一个数据报 Socket 服务器端调 用 Accept 客户端调用 Connect 然后创建一个 CsocketFile 去关联 CSocket 接下来的操作可以创建 CArchive 对象关联 CsocketFile 以用来发 送和接收数据 第 12 页 共 26 页 图 5 TCP 套接字的使用 5 1 25 1 2 文字聊天实现文字聊天实现 ChatServer 服务器运行时 利用一个 CSocket 对象 CSocketServer 启动服 务器 用函数 gethostname 来获得服务器端主机名和 IP 同时在服务器对话框 中显示服务器 IP 并将分配的固定端口号 8123 显示在对话框中 用一个 list 列表显示在线用户 随时更新用户登录情况 用一个 edit box 显示客户端的聊 天内容以及系统提示消息 每一个 ChatClient 客户端启动时 利用服务器内定 的用户号和密码来登录 如图 6 在整个系统中 利用链表来处理所有的用户 信息 当有用户登录时 在链表尾部加入该用户信息 当用户下线时 在该链 表中删除用户 并提示所有用户 该用户下线 在对链表进行操作的同时 要 第 13 页 共 26 页 更新 list 列表中的信息 图 6 用户登录界面 ChatServer 服务器端响应客户端文字聊天时的中转情况如图 7 图 7 服务器响应文字聊天信息中转 ChatClient 客户端两两间进行文字聊天时 发送信息的处理函数如下 void CChatClientDlg OnChatBtSend 发送信息按键 if m bConnect SetMessageBox 请连接服务器 r n return CString str 第 14 页 共 26 页 CString szUserName CMesg msg GetDlgItemText IDC MESSAGE str GetDlgItemText IDC USERNAME szUserName if str GetLength 0 SetMessageBox 请输入想要发送的信息 r n return if szUserName GetLength SendM AddReceiver szUserName true AddChatMessage str 在聊天两个客户端的信息情况如图 8 和图 9 第 15 页 共 26 页 图 8 接收文字信息 图 9 发送文字信息 5 25 2语音视频聊天语音视频聊天 5 2 15 2 1 UDPUDP 套接字的运用套接字的运用 在实现语音视频聊天时 采用的是基于 UDP 套接字的点对点模式 而 UDP 面 向的是无连接的数据服务 其套接字的使用如图 10 所示 第 16 页 共 26 页 图 10 UDP 套接字的使用 5 2 25 2 2 视频的捕获视频的捕获 利用 VFW 接口 视频捕获可以分为以下几个步骤 1 建立视频采集窗口 该窗口用来接收视频捕捉驱动程序传来的数据 和消息 2 连接视频驱动程序 将建立的视频捕捉窗口与视频设备驱动程序相 连 3 视频捕获初始化 4 视频捕捉设置 VFW 下视频捕捉参数的设置可以通过调用函数或弹 出对话框的形式来实现 一般视频驱动程序允许设置的参数包括视频源选择 视频格式 视频显示格式等 5 设置回调函数 通过回调函数来通知程序视频事件的发生 比如捕 捉一帧图像成功的消息 捕捉出错的消息等 6 结束捕捉 结束捕捉是应该有一些清除工作 如释放分配的内存 第 17 页 共 26 页 断开捕捉窗口与视频捕捉驱动程序的连接 清除视频捕捉窗口等 7 窗口类为捕获数字视频流及其相关操作提供了很大的方便 灵活编写其中 的回调函数可满足实时视频传输的需要 例如应用程序可直接从缓冲中取得数 字视频并对其进行压缩编码后实时地传到远端的客户端 在 VC 中 采用 VFW 技术 客户端通过 capSetCallbackOnFrame 注册回 调函数 当采集卡采集到一幅图像后 系统就会自动调用回调函数 然后再回 调函数中使用 ICSeqCompressFrame 函数进行压缩 然后再通过 Winsock 将压 缩后的数据发送到另一客户端 该客户端接收完一帧以后 交给 ICDecompress 解压 最后用 SetDIBitsToDevice 将图像显示出来 基本的捕获设置包括设置捕获速度 每秒捕获多少帧 是否同时捕获声频 捕获缓冲 允许最大丢失多少帧和是否使用 DOS 内存 以及使用键盘的哪个键 或鼠标的哪个键来终止捕获等内容 这些设置使用 CAPTUREPARAMS 结构来描述 capCaptureGetSetup 宏来得到当前的设置 然后改变此结构的成员变量 再使 用 capCaptureSetSetup 宏设置新的设置 设置捕获速度 通过使用 capCaptureGetSetup 宏来得到当前的捕捉速度 将当前的捕捉速度保存在 CAPTUREPARAMS 结构的 dwRequestMicroSecPerFrame 成员变量中 也可以通过设置此变量来改变当前设置值 设置终止捕获 同样通过使用 capCaptureGetSetup 宏来得到当前的设置 当前按键设置保存在 CAPTUREPARAMS 结构的 vKeyAbort 成员中 鼠标设置保存 在 fAbortLeftMouse 和 fAbortRightMouse 成员中 通过修改可以设置新的热健 或者鼠标左右键 修改完成后 使用 capCaptureSetSetup 宏来进行更新 捕获的时间限制 用 CAPTUREPARAMS 结构中的 fLimitEnabled 表示捕获是 否有时间的限制 wTimeLimit 用来设置指示捕获最大的持续时间 其单位为秒 使用 capCaptureGetSetup 宏来得到当前的设置值 7 下面程序为设置 CAPTUREPARAMS 结构的实现代码 BOOL VideoCapture SetCapturePara CAPTUREPARMS CapParms 0 capCaptureGetSetup m capwnd 第 18 页 共 26 页 得到当前的捕获速度 CapParms fAbortLeftMouse FALSE CapParms fAbortRightMouse FALSE CapParms fYield TRUE CapParms fCaptureAudio FALSE CapParms wPercentDropForError 80 if capCaptureSetSetup m capwnd return FALSE Set Video Format capGetVideoFormat m capwnd m bmpinfo bmiHeader biWidth IMAGE WIDTH m bmpinfo bmiHeader biHeight IMAGE HEIGHT BOOL ret capSetVideoFormat m capwnd log WriteString n Video parameters set properly return ret 终止一个捕获任务 BOOL VideoCapture StopCapture capCaptureStop m capwnd capCaptureAbort m capwnd Sleep 500 return TRUE 第 19 页 共 26 页 5 2 35 2 3 捕获窗口捕获窗口 在捕获前必须创建一个捕获窗口 Capture Widnow 下面介绍有关捕获窗 口的情况 创建一个 AVICap 捕获窗口 用 capCreateCaptureWindow 函数并返 回一个句柄 将捕获窗口连接至捕获设备 用 capDriverConnect 函数来使一个 捕获窗口与一个捕获设备连接或关联连接上后 就可以通过捕获窗口向捕获设备 发送各种消息 可以使用函数 capGetDriverDescription 来获得已安装的捕获设 备名称及版本 将其列举在实现程序过程中 再利用 capDriverGetName 函数来 得到捕获设备的名称将获得的版本发送到 capDriverGetVersion 如果断开捕 获窗口与捕获设备的连接用 capDriverDisconnect 捕获窗口的状态 用 capGetStatus 函数来获得当前捕获窗口的状态 得到 一个 CAPSTATUS 结构的拷贝 该结构的内容包含了图片的尺寸 卷轴的当前位 置 overlay 和 preview 是否已设置 由于其信息是动态的 每当捕获的视频 流的尺寸发生改变 程序应该在获取捕获设备的视频格式以后及时进行刷新 而捕获窗口尺寸的改变并不影响实际的捕获视频流的尺寸 该尺寸由视频捕获 设备的格式和视频对话框决定 7 捕获窗口 BOOL VideoCapture Initialize char devname 128 0 devversion 128 0 int index 0 BOOL ret TRUE ret1 TRUE ret2 TRUE ret3 TRUE TRACE VideoCapture Initialize n 创建一个 AVICap 捕获窗口 m capwnd capCreateCaptureWindow Capture WS POPUP 0 0 1 1 0 0 if m capwnd return FALSE connect callback functions ret capSetUserData m capwnd this 第 20 页 共 26 页 Change destroy functions also ret1 capSetCallbackOnVideoStream m capwnd OnCaptureVideo 得到已安装的捕获设备的名称及版本 ret2 capGetDriverDescription index devname 100 devversion 100 Connect to webcam driver 使一个捕获窗口与一个捕获设备连接或关联 ret3 capDriverConnect m capwnd index if ret log WriteString n Unable to connect driver to the window m capwnd NULL return FALSE Set the capture parameters if SetCapturePara FALSE log WriteString n Setting capture parameters failed capDriverDisconnect m capwnd 使捕获窗口与一个捕获设备断开 return FALSE return TRUE 5 2 45 2 4 视频捕获驱动视频捕获驱动 视频捕获必须具有视频捕获驱动才能进行 其相关内容如下 视频捕获驱动的性能 capDriverGetCap 函数得到当前连接视频驱动的硬 第 21 页 共 26 页 件性能 该信息保存在 CAPDRIVERCAPS 结构中 视频对话框 每个视频驱动能 够提供 4 个对话框来控制视频捕获和数字化处理视频对话框定义的视频压缩率 和图像品质等 视频对话框都在视频捕获驱动中定义 这个四个对话框分别为 Video Source 对话框用于控制选择视频来源 capDlgVideoSource Video Format 对话框定义视频帧的尺寸和精度 以及视频捕获卡的压缩设置 capDlgVideoFormat Video Display 对话框控制在视频捕获期间相关显示器 上的显示 capDlgVideoDisplay Video Compression 对话框控制压缩和图像 品质 caoDlgVideoCompression 7 5 2 55 2 5 语音录制语音录制 在音频的录制和播放时 采用的用户界面线程来处理 是 CWinThread 对象 根据前面线程的介绍 一步一步的来实现 录音用的一个 CWinThread 对象 CAudioRec 来实现 部分实现代码 LRESULT CAudioRec OnStartRecording WPARAM wp LPARAM lp if recording return FALSE 打开录音设备 MMRESULT mmReturn waveInOpen if mmReturn MMSYSERR NOERROR return FALSE if mmReturn MMSYSERR NOERROR for int i 0 i MAXRECBUFFER i 为录音设备准备缓存 mmReturn waveInPrepareHeader m hRecord rechead i sizeof WAVEHDR 给输入设备增加一个缓存 mmReturn waveInAddBuffer m hRecord 第 22 页 共 26 页 rechead i sizeof WAVEHDR mmReturn waveInStart m hRecord 开始录音 if mmReturn MMSYSERR NOERROR recording TRUE return TRUE 5 2 65 2 6 语音回放语音回放 相对录音而言 播放就简单多了 同样用的一个 CWinThread 对象 CAudioPlay 来实现 部分实现代码 LRESULT CAudioPlay OnWriteSoundData WPARAM wParam LPARAM lParam TRACE CAudioPlay OnWriteSoundData n MMRESULT mmResult FALSE char p NULL int length int wParam if Playing FALSE return FALSE if lengthlpData p lpHdr dwBufferLength length mmResult waveOutPrepareHeader m hPlay lpHdr sizeof WAVEHDR 第 23 页 共 26 页 为回放设备准备内存块 if mmResult delete lpHdr delete p return mmResult mmResult waveOutWrite m hPlay lpHdr sizeof WAVEHDR 写数据 放 音 if mmResult delete lpHdr delete p return mmResult m Count return MMSYSERR NOERROR 5 2 75 2 7 视音频的传输视音频的传输 视频采集采用 AVICap 从视频采集卡捕获视频图像 得到的是位图形式的视 频帧 然后用 Divx 编码器进行压缩 压缩以后形成以帧为格式的 Mpeg4 流 通 过 Winsock 实现压缩后的视频数据在局域网中的实时传输 接收完的数据交给 Divx 解码器 以帧的格式解压 最后实现视频显示 所以提出以帧为单位发送 视频数据流 为了在接收端能够方便地提取出一帧 提出如表 1 所示的格式组 建帧 完整的一帧由 5 个字段组成 各个字段的意义如下 帧开始标志 标志 着一帧地开始 占用 4 个字节的空间 帧大小 表示整个帧的大小 包括 5 个 字段的大小 占用 4 个字节的空间 帧编号 表示帧的顺序编号 占用 4 个字 节的空间 帧类型 标志此帧是否是关键帧 占用 1 个字节的空间 帧数据 存放压缩后一帧的完整数据 表 1 视频帧的格式 帧开始标志帧大小帧编号帧类型帧数据 0 4 8 12 13 2012 处理视频传输如图 11 所示 第 24 页 共 26 页 图 11 视频的传输 相对于视频的传输 语音的传输就简单得多了 在这里建立了两个线程来 处理 先来用一个语音录制线程在一个客户端录制语音 再通过用 G729a 对语 音进行编码 然后传输到另一客户端 同样用 G729a 对语音进行解码 然后用 一个语音回放线程将语音播放出来 7 将视频语音信息在客户端显示出来 如图 12 所示 图 12 语音视频聊天 结结 论论 随着通讯技术的普及和网络的发展 社会上越来越重视信息交流的方便 及时和准确 借助网络视频通讯软件实现 面对面 的网络交流 由于信息量 的无限扩大 交通工具的便捷 视频技术的充分应用已经成为现代通讯必不可 少的一项技术运用 基于局域网的视频聊天室系统可以跨越空间距离 灵活多 第 25 页 共 26 页 样的面对面的交互 适应现代社会的方便 快捷 高效 快节奏 在编写程序的过程中 我也遇到了很多的问题 通过老师的指点和查阅资 料等得到了解决 并圆满完成了整个程序的开发工作 同时积累了许多解决经 验 这次的毕业设计达到了预期的目的 实现了文字聊天和语音视频聊天 通 过这次毕业设计 使我从理论到实践迈出了坚实的一步 在学习理论 分析和 组织程序结构以及具体的实现等整个过程中 我体会到了编写程序的酸 甜 苦 辣 要编写出一个好的程序 必须要有缜密的思维 谨慎的作风和坚忍不 拔的毅力 参考文献参考文献 1 谢希仁 计算机网络 M 北京 电子工业出版社 2004 2 W Richard Stevens TCP IP 详解 M 北京 机械工业出版社 2005 3 张炯 Unix 网络编程 M 北京 清华大学出版社 2002 4 求是科技 王正军 Visual C 6 0 从入门到精通 M 北

温馨提示

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

评论

0/150

提交评论