基于DELPHI的网络视频编程

时间:2022-04-22 04:33:09

基于DELPHI的网络视频编程

摘要:Delphi被称为第四代编程语言,它具有简单、高效、功能强大的特点。和VC、VC++等编程语言相比,Delphi更简单、更易于掌握,而在功能上却丝毫不逊色,集成了多种语言的特点,可以开发出灵活强大的程序。在各种聊天程序、聊天室中,常常用到网络视频技术,开发网络视频程序的工具有很多,Delphi是很多程序员喜爱的一种。本文就笔者开发的基于Delphi的网络视频编程进行分析阐述,并给出部分Delphi的相关代码。

关键词:Delphi;网络视频;编程

中图分类号:TP311文献标识码:A文章编号:1009-3044(2009)14-3619-02

1 引言

在各种聊天程序、聊天室中,常常用到网络视频技术。Delphi具有强大的功能,也可以用Delphi来开发网络视频。本文就笔者开发的基于Delphi的网络视频编程进行分析阐述,并给出部分Delphi的相关代码。

2 视频捕获

视频捕获,可以使用微软提供的专门用于视频捕获的VFW(Video for Windows)SDK。VFW SDK为在Windows系统中实现视频捕获提供了标准的接口,从而大大方便了程序员的设计开发。

VFW是微软公司推出的关于数字视频的一个软件包,它能使应用程序通过数字化设备从传统的模拟视频源得到数字化的视频剪辑。VFW的一个关键思想是播放时不需要专用硬件,为了解决数字视频数据量大的问题,需要对数据进行压缩。VFW使程序员能通过发送消息或设置属性来捕获、播放和编辑视频剪辑。

VFW主要由以下6个模块组成:① AVICAP.DLL:包含了执行视频捕获的函数,它给AVI文件I/O和视频、音频设备驱动程序提供一个高级接口;② MSVIDEO.DLL:包含一套特殊的DrawDib函数,用来处理屏幕上的视频操作;③ MCIAVI.DRV:包括对VFW 的MCI命令解释器的驱动程序;④AVIFILE.DLL:包含由标准多媒体I/O(MMIO)函数提供的更高的命令,用来访问.AVI文件;⑤压缩管理器(ICM):用于管理的视频压缩/解压缩的编译码器(CodeC);⑥ 音频压缩管理器ACM:提供与ICM相似的服务,适用于波形音频。

AVICAP为应用程序提供了一个简单的、基于消息的接口,使之能访问视频和波形音频硬件,并能在将视频流捕获到硬盘上的过程中进行控制。AVICAP支持实时的视频流捕获和图像捕获并提供对视频源的控制。AVICAP在捕获视频方面具有一定的优势,它能直接访问视频缓冲区,不需要生成中间文件,实时性很强,效率很高。同时,它也可将数字视频捕获到文件。

利用AVICAP进行视频捕获的开发步骤有:① 创建“捕获窗”;② 关联捕获窗和驱动程序;③ 设置视频设备的属性;④ 打开预览。

通过以上4步就可以建立一个基本的视频捕获程序。下面介绍实现基于Delphi的视频捕获。

使用微软的AVICAP32.DLL实现对视频摄像头控制:

1) 打开Delphi,新建一个工程,并新建一个窗口。先定义一个函数和部分常量(定义成全局类型)。

const WM_AP_START=WM_USER;

const DRIVER_CONNECT=WM_CAP_START+10

const SET_PREVIEW=WM_CAP_START+50

const SET_CALLBACK_VIDE05TREAM=WM_CAP_START+6;

const SET_SCALE=WM_ CAP_TART+53;

const SET_PREVIEWRATE=WM_CAP_START+52

const DRIVER_DISCONNECT=WM_CAP_START+11;

function capCreateCaptureWindowA(1pszWindowName:PCHAR;

dwStyleaongint;x:integer;y:integer;nWidth:integer;

nHeight:integer;ParentWin:HWND;nId:integer):HWND;

STDCALL EXTERNAL 'AVICAP32.DLL'

2) 在窗口上放置一个Panel,添加2个按钮,Caption设置为“开始”和“停止”,并定义一个全局变量,var CWin2:THandle;//定义捕捉窗句柄。

“开始”按钮代码如下:

CWin2: =capCreateCapture WindowA('My CAPWin', WS_CHILD or WS_VISIBLE,

Panell.Left, Panell.Top, Panell.Width, Panell.Height,Form 1. Handle, 0 )

//上面代码创建“捕获窗”

if CWin20 then

begin

SendMessage ( CWin2 , SET_CALLBACK_VIDEOSTREAM,0, 0);

SendMessage (CWin2,DRIVER_CONNECT,O,0);

//上面代码关联捕获窗和驱动程序

SendMessage(CWin2,SET SCALE,1,0)

SendMessage (CWin2,SET_PREVIEWRATE,66,0);

//上面代码Scale , Rate设置预览的比例与速度

SendMessage(CWin2,SET_PREVIEW,1,0);

//上面代码打开预览

end;

运行Delphi,这时就可以在屏幕上看到来自摄像头的图像了。

“停止”按钮代码如下:

if Cwin20 then begin

SendMessage(CWin2, DRIVER_DISCONNECT,0,0);

CWin2:= 0;

end;

3 对捕获的视频进行压缩与解压

通过AVICap窗口捕获的每一帧的数据是以BMP (RAW)文件格式存放的,若直接进行传输,数据量非常大,对网络的带宽要求非常高,因此在传输之前必须对每一帧的数据进行压

缩处理后再进行传输。具体步骤:

第一步,安装视频压缩引擎。媒体播放器软件都带有压缩引擎,也可以从网上下载单独的解压缩引擎,比如MPEG4或DIVX等。

第二步,初始化压缩引擎。选择压缩引擎,获得压缩引擎的支持,确定输人、输出格式,设置压缩器。

第三步,压缩帧数据。通过指定的压缩引擎,对获取的每一帧数据进行压缩。

解压的过程与压缩的过程类似,通过选择相对应的解压引擎,将压缩的数据解压,以便于回放。

4 视频数据传输

4.1 基本概念

计算机在传输数据时有两种方式:分别是TCP(Transmission Control Protocol,传输控制协议)及UDP(User Datagram Protocol,用户数据报协议),两者分别因数据传输的不同请求而提供不同的数据传输方式。

1) TCP协议

TCP是一个基于连接的通信协议,主要目的是提供大量数据传输并确保其传输无误,因此提供错误检查、数据复原及数据重传等机制。TCP在传输数据之前,会先在主机间(例如主控端与被控端)创建连接。根据此连接,数据可在计算机间相互传输,即所谓的双向传输模式。

2) UDP协议

UDP是一个非连接式的通信协议,主要目的在于传输少量的数据。与TCP不同的是,TCP在传输之前必须创建连接,而UDP不需要,只要设置计算机间的IP及使用相同的端口,就可以相互传输数据。因此UDP只提供单向的数据传输,即所谓的单向无连接传输模式。

由于UDP不需要先创建连接,节省了TCP创建连接所需的时间,所以适合在主机间进行单向的数据传输。由于视频数据的传输对于实时性要求很高,即使传输过程中有个别帧的数据有错,也不会影响整个视频的效果,故本文将会详细介绍如何通过UDP实现视频数据的传输。

4.2 控件及相关内容介绍

在Delphi中对于UDP及TCP都提供了很好的支持,而且将它们封装起来。开发人员无须知道协议的具体实现细节,而只要使用Delphi提供的TIdUDPServer元件(在Indy Servers页)即可完成相应的功能。下面我们一起来认识一下这个元件。

1) 相关属性

DefaultPort该属性是用来指定作为客户端时要打开的端口号,也就是通过该端口来接收数据。

Active该属性是用来打开指定的端口号,设置为True表示打开端口,False表示关闭端口。

BroadcastEnabled该属性是用来设置是否用来实现广播,设置为True表示可以广播,False表示不能广播。

2) 相关事件

OnUDPRead当客户端收到服务器端发来数据时触发该事件,通过该事件我们可以取得服务器端发的每一帧的数据,以便在客户端回放。

除了以上提到的一些属性及事件外,TIdUDPServer还有一个重要的方法需要了解,那就是SendBuffer,通过该方法可以在服务器端向指定客户端的指定端口发送数据。

5 结束语

目前,Delphi已经被很多的程序开发者作为开发网络视频程序工具。本文介绍的网络视频编程,应该是目前比较常用的方法之一。本文所有程序在Win XP/Delpphi 7.0下实现通过,所用视频摄像头为市场上普通销售的产品。

参考文献:

[1] 白先平. 应用Delphi开发视频语音聊天软件[J]. 科技资讯,2006,29:113.

[2] 李国芳. 在VC++ 6.0中实现视频捕获编程[J]. 井冈山医专学报,2003(4):76-78.

[3] 刘德华. 在Delphi下实现对数据库中图像的操作[J]. 电脑编程技巧与维护,2007(7):60-62.

[4] 何鹏飞. Delphi7程序设计教程[M]. 北京:清华大学出版社,2003.

上一篇:脚本语言在三维可视化技术中的应用与研究 下一篇:破损图片识别与修复技术分析