内容摘要:许多关于视频的软件(如视频会议、可视电话等)开发都应用于视频捕获技术。微软为软件开发人员提供了一个专门用于视频捕获的VFW SDK,从而为在Windows系统中实现视频捕获提供了标准的接口,并大大降低了程序的开发难度。由于VFW SDK只有VC和VB版,没有Delphi版,因此需要在Delphi中一一声明DLL中的各个函数和变量。文中详细介绍了如何利用VFW在Delphi中开发视频捕获程序的步骤,同时给出了程序实例。
以下是引用片段:
(1)新建一个工程,并将AVICAP32.PAS包含到USES中。
(2)在Form1上放置一个Tpanel控件,设Name为“gCapVideoArea”,该控件用于显示视频。之后再放置两个Tbutton控件,一个Name为“Openvideo”,另一个Name为“Closevideo”。
(3)定义全局变量
ghCapWnd:Thandle;//定义捕获窗句柄
VideoStr:LPVIDEOHDR;//可以得到视频数据指针的结构变量,用于回调函数中
CapParms:TcaptureParms;//用于设置设备属性的结构变量
(4)编写代码
在Name为“Openvideo”的Tbutton的Click事件中写入以下代码:
procedureTform1.OpenvidoClick(Sender:TObject);
begin
//使用Tpanel控件来创建捕获窗口
ghCapWnd:=CapCreateCaptureWindow(Pchar('KruwoSoft'),
WS_CHILDorWS_VISIBLE,//窗口样式
0,//X坐标
0,//Y坐标
gCapVideoArea,Width,//窗口宽
gCapVideoArea,Handle,//窗口句柄
0);//一般为0
为了能够捕获视频,应启动一个捕获帧回调函数VideoStreamCallBack。捕获一个视频流或当前设备状态时,应分别使用以下函数:
CapSetCallbackOnVideoStream;//捕获一个视频流
CapSetCallbackOnError;//得到一个设备错误
CapSetCallbackOnStatus//得到一个设备状态
//定义一个帧捕获回调函数
CapSetCallbackOnFrame(ghCapWnd,LongInt(@VideoStreamCallBack));
//将一个捕获窗口与一个设备驱动相关联,第二个参数是个序号,当系统中装有多个显示驱动程序时,其值分别依次为0到总个数
CapDreiverConnect(ghCapWnd,0);
CapParms,dwRequestMicroSecPerFrame:=40000;
CapParms.fLimitEnabled:=FALSE;
CapParms.fCaptureAudio:=FALSE;//NOAudio
CapParms.fMCIControl:=FALSE;
CapParms.fYield:=TRUE;
CapParms.vKeyAbort:=VK_ESCAPE;
CapParms.fAbortLeftMouse:=FLASE;
CapParms.fAbortRightMouse:=FALSE;
//使设置生效
CapCaptureSetSetup(ghCapWnd,LongInt(@CapParms),sizeof(TCAPTUREPARMS));
CapPreviewScale(ghCapWnd,1);
CapPreviewRate(ghCapWnd,66);
如果要捕获视频流,则要使用函数来指定不生成文件。否则将会自动生成AVI文件:
CapCaptureSequenceNoFile(ghCapWnd);
指定是否使用叠加模式,1为使用,否则为0;
CapOverlay(ghCapWnd,1);
CapPreview(ghCapWnd,1);
End;
在Name为“Closevideo”的Tbutton的Click事件中写入以下代码:
procedureTForm1.ClosevideoClick(Sender:Tobject);
begin
capCaptureAbort(ghCapWnd);//停止捕获
capDriveDisconnect(ghCapWnd);//将捕获窗同驱动器断开
end;
定义捕获帧回调函数:
functionFrameCallBack(hWnd:HWND;lpVHdr:LongInt):LongInt;stdcall;
var
DataPoint:^byte;
DibLen,RectWidth,RectHeight:integer;
begin
VideoStr:=LPVIDEOHDR(lpVHdr);
DibLen:=VideoStr^.dwBufferLength;
GetMem(DataPoint,64000);
//将帧数据COPY到一个内存中,注意:DATAPOINT要先分配空间
CopyMemory(DataPoint,VideoStr^.lpData,Diblen);
……
end;4 结束语
灵活地使用AVICap窗口类的回调函数可以满足各种需求,但要注意从视频卡中捕获的视频数据的格式和图像的长宽要参考视频卡的参数。另外,有些视频卡通过设置可支持多种格式和图像长宽,所以,在还原图像时,要注意参考所用的视频卡的参数。
责编:豆豆技术应用
正在加载评论...
- Delphi新闻
- Delphi教程
- Delphi 7.0
- Delphi 2007
- Delphi控件
- Delphi网络编程
- Delphi for php
- Delphi界面/视图
- Delphi系统控制
- Delphi数据库
- Delphi源码下载