首 页 用户登录 | ![]() |
|||
|
|||
按字母检索 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
按声母检索 | A | B | C | D | E | F | G | H | J | K | L | M | N | O | P | Q | R | S | T | W | X | Y | Z | 数字 | 符号 |
|
![]() |
您的位置: 5VAR论文频道 → 论文中心 → 理工论文 → 电子通信 |
|
|||||
基于Delphi的VFW视频捕获程序的开发 | |||||
收集整理:佚名 来源:本站整理 时间:2009-01-10 23:55:08 点击数:[] ![]() |
|||||
面的特殊需求,笔者选用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事件中写入以下代码: procedure Tform1.OpenvidoClick(Sender:TObject); begin //使用Tpanel控件来创建捕获窗口 ghCapWnd:=CapCreateCaptureWindow(Pchar('KruwoSoft'), WS_CHILD or WS_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;//NO Audio 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事件中写入以下代码: procedure TForm1.ClosevideoClick(Sender:Tobject); begin capCaptureAbort(ghCapWnd); //停止捕获 capDriveDisconnect(ghCapWnd); //将捕获窗同驱动器断开 end; 定义捕获帧回调函数: function FrameCallBack(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窗口类的回调函数可以满足各种需求,但要注意从视频卡中捕获的视频数据的格式和图像的长宽要参考视频卡的参数。另外,有些视频卡通过设置可支持多种格式和图像长宽,所以,在还原图像时,要注意参考所用的视频卡的参数。 |
提供人:佚名 | |
【返回上一页】【打 印】【关闭窗口】 |
![]() |
5VAR论文频道 |
![]() |
5VAR论文频道 |
![]() |
关于本站 -
网站帮助 -
广告合作 -
下载声明 -
网站地图
Copyright © 2006-2033 5Var.Com. All Rights Reserved . |