视频捕捉程序开发的基本步骤精.docx

上传人:b****7 文档编号:23353325 上传时间:2023-05-16 格式:DOCX 页数:34 大小:24.20KB
下载 相关 举报
视频捕捉程序开发的基本步骤精.docx_第1页
第1页 / 共34页
视频捕捉程序开发的基本步骤精.docx_第2页
第2页 / 共34页
视频捕捉程序开发的基本步骤精.docx_第3页
第3页 / 共34页
视频捕捉程序开发的基本步骤精.docx_第4页
第4页 / 共34页
视频捕捉程序开发的基本步骤精.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

视频捕捉程序开发的基本步骤精.docx

《视频捕捉程序开发的基本步骤精.docx》由会员分享,可在线阅读,更多相关《视频捕捉程序开发的基本步骤精.docx(34页珍藏版)》请在冰豆网上搜索。

视频捕捉程序开发的基本步骤精.docx

视频捕捉程序开发的基本步骤精

2视频捕捉程序开发的基本步骤

2.1使用AVICap窗口类

笔者使用的是AVICap窗口类来开发视频捕捉程序。

AVICap类支持实时视频流捕捉和单帧捕捉,并提供对视频源的控制。

通常使用的MCI控件虽然也提供了数字视频服务。

并为视频叠加提供了Overlay命令集等,但这些命令主要是基于文件的操作,还不能满足实时地从视频缓存中提取数据的要求。

对于使用没有视频叠加能力的捕捉卡的PC机来说,用MCI提供的命令集是无法捕捉视频流的。

而AVICap窗口类在捕捉视频方面具有一定的优势,它能直接访问视频缓冲区,而不需要生成中间文件,因而实时性很强,效率也很高。

另外,它还可将数字视频捕捉到一个文件中。

2.2开发的基本步骤

开发视频捕捉程序主要有以下四个步骤:

(1创建“捕捉窗”。

在进行视频捕捉之前必需要先创建一个“捕捉窗”,并应以此为基础进行所有的捕捉及设置操作。

“捕捉窗”可用AVICap窗口类的“CapCreateCaptureWindow”函数来创建,其窗口风格可设置为WSCHILD和WS_VISIBLE参数。

“捕捉窗”类似于标准控件,它具有下列功能:

将视频流和音频流捕捉到一个AVI文件中;

动态地同视频和音频输入器件连接或断开;

以Overlay或Preview模式对输入的视频流进行实时显示;

在捕捉时,可指定所用的文件名,并可将捕捉文件的内容拷贝到另一个文件;

设置捕捉速率;

显示控制视频源、视频格式及视频压缩的对话框;

创建、保存或载入调色板;

将图像和相关的调色板拷贝到剪贴板;

将捕捉的单帧图像保存到DIB格式文件。

(2关联捕捉窗和驱动程序

单独定义的捕捉窗是不能工作的,它须与一个设备相关联才能取得视频信号。

用函数CapDriverConnect可使捕捉窗与其设备驱动程序相关联。

(3设置视频设备的属性

通过设置TcaptureParms结构变量的各个成员变量,可以控制设备的采样频率、中断采样按键、状态行为。

设置好TcaptureParms结构变量后,可以用函CapCaptureSetSetup使设置生效。

之后还可以用CapPreviewScale、CapPreviewRate设置预览的比例与速度,也可以直接使用设备的默认值。

(4打开预览

利用函数CapOverlay可选择是否采用叠加模式预览,以使系统资源占用小,视频显示速度加快。

然后用CapPreview启动预览功能,这时就可以在屏幕上看到来自摄像机的图像了。

通过以上四步就可以建立一个基本的视频捕捉程序,但假如想自己处理从设备捕捉到的视频数据,则要使用捕捉窗回调函数来处理,比如一帧一帧地获得视频数据或以流的方式获得视频数据等。

3基于Delphi的视频捕捉程序

根据系统对系统访问、处理速度等方面的非凡需求,笔者选用Delphi作为开发工具。

下面以开发一个逐帧从视频设备上捕捉视频数据的程序为例,来说明每个函数的作用以及开发的具体过程。

所给例程的功能是可以在屏幕上显示捕捉到的视频,并可以获得每一帧的图像数据。

具体步骤如下:

(1新建一个工程,并将AVICAP32.PAS包含到USES中。

{PASCALINTERFACEforAVICAP32DLL}

{ConvertedfrommicrosoftHeaderfilebyArTee}

{Freetouse-I'mNOTresponsiblefobugs}

unitavicap32;

interface

usesWindows,Messages,SysUtils,MMSystem;

//Thispartmightbebuggy.

//It'Assumes'typesbecauseIcannotfindthecorrectunit

type

HVIDEO=longword;//Handle;

UINT=longword;

POINT=record

x,y:

integer

end;

LPPOINT=^POINT;

FOURCC=record

c1,c2,c3,c4:

char;

end;

mmioFOURCC=FOURCC;

LPVOID=Pointer;

//LPWAVEHDR,LPVIDEOHDRwordengebruiktindecall-backfunctions!

ikhebzemaargereplacedmetintegers.

{***************************************************************************

*

*avicap.h

*

*Mainincludefile.

*

*MicrosoftVideoforWindowsSampleCaptureClass

*

*Copyright(c1992,1993MicrosoftCorporation.AllRightsReserved.

*

*Youhavearoyalty-freerighttouse,modify,reproduceand

*distributetheSampleFiles(and/oranymodifiedversionin

*anywayyoufinduseful,providedthatyouagreethat

*Microsofthasnowarrantyobligationsorliabilityforany

*SampleApplicationFileswhicharemodified.

*

**************************************************************************}

//constAVICapSM=SendMessage;{SendMessageinC}

//------------------------------------------------------------------

//WindowMessagesWM_CAP...whichcanbesenttoanAVICAPwindow//------------------------------------------------------------------

//Definesstartofthemessagerange

const

WM_CAP_START=WM_USER;

const

WM_CAP_GET_CAPSTREAMPTR=(WM_CAP_START+1;

const

WM_CAP_SET_CALLBACK_ERROR=(WM_CAP_START+2;

const

WM_CAP_SET_CALLBACK_STATUS=(WM_CAP_START+3;

const

WM_CAP_SET_CALLBACK_YIELD=(WM_CAP_START+4;

const

WM_CAP_SET_CALLBACK_FRAME=(WM_CAP_START+5;

const

WM_CAP_SET_CALLBACK_VIDEOSTREAM=(WM_CAP_START+6;const

WM_CAP_SET_CALLBACK_WAVESTREAM=(WM_CAP_START+7;const

WM_CAP_GET_USER_DATA=(WM_CAP_START+8;

const

WM_CAP_SET_USER_DATA=(WM_CAP_START+9;

const

WM_CAP_DRIVER_CONNECT=(WM_CAP_START+10;

const

WM_CAP_DRIVER_DISCONNECT=(WM_CAP_START+11;

const

WM_CAP_DRIVER_GET_NAME=(WM_CAP_START+12;

const

WM_CAP_DRIVER_GET_VERSION=(WM_CAP_START+13;

const

WM_CAP_DRIVER_GET_CAPS=(WM_CAP_START+14;

const

WM_CAP_FILE_SET_CAPTURE_FILE=(WM_CAP_START+20;

const

WM_CAP_FILE_GET_CAPTURE_FILE=(WM_CAP_START+21;

const

WM_CAP_FILE_ALLOCATE=(WM_CAP_START+22;

const

WM_CAP_FILE_SAVEAS=(WM_CAP_START+23;

const

WM_CAP_FILE_SET_INFOCHUNK=(WM_CAP_START+24;const

WM_CAP_FILE_SAVEDIB=(WM_CAP_START+25;

const

WM_CAP_EDIT_COPY=(WM_CAP_START+30;

const

WM_CAP_SET_AUDIOFORMAT=(WM_CAP_START+35;

const

WM_CAP_GET_AUDIOFORMAT=(WM_CAP_START+36;

const

WM_CAP_DLG_VIDEOFORMAT=(WM_CAP_START+41;

const

WM_CAP_DLG_VIDEOSOURCE=(WM_CAP_START+42;

const

WM_CAP_DLG_VIDEODISPLAY=(WM_CAP_START+43;const

WM_CAP_GET_VIDEOFORMAT=(WM_CAP_START+44;

const

WM_CAP_SET_VIDEOFORMAT=(WM_CAP_START+45;

const

WM_CAP_DLG_VIDEOCOMPRESSION=(WM_CAP_START+46;const

WM_CAP_SET_PREVIEW=(WM_CAP_START+50;

const

WM_CAP_SET_OVERLAY=(WM_CAP_START+51;

const

WM_CAP_SET_PREVIEWRATE=(WM_CAP_START+52;

const

WM_CAP_SET_SCALE=(WM_CAP_START+53;

const

WM_CAP_GET_STATUS=(WM_CAP_START+54;

const

WM_CAP_SET_SCROLL=(WM_CAP_START+55;

const

WM_CAP_GRAB_FRAME=(WM_CAP_START+60;

const

WM_CAP_GRAB_FRAME_NOSTOP=(WM_CAP_START+61;

const

WM_CAP_SEQUENCE=(WM_CAP_START+62;

const

WM_CAP_SEQUENCE_NOFILE=(WM_CAP_START+63;

const

WM_CAP_SET_SEQUENCE_SETUP=(WM_CAP_START+64;const

WM_CAP_GET_SEQUENCE_SETUP=(WM_CAP_START+65;const

WM_CAP_SET_MCI_DEVICE=(WM_CAP_START+66;

const

WM_CAP_GET_MCI_DEVICE=(WM_CAP_START+67;

const

WM_CAP_STOP=(WM_CAP_START+68;

const

WM_CAP_ABORT=(WM_CAP_START+69;

const

WM_CAP_SINGLE_FRAME_OPEN=(WM_CAP_START+70;

const

WM_CAP_SINGLE_FRAME_CLOSE=(WM_CAP_START+71;

const

WM_CAP_SINGLE_FRAME=(WM_CAP_START+72;

const

WM_CAP_PAL_OPEN=(WM_CAP_START+80;

const

WM_CAP_PAL_SAVE=(WM_CAP_START+81;

const

WM_CAP_PAL_PASTE=(WM_CAP_START+82;

const

WM_CAP_PAL_AUTOCREATE=(WM_CAP_START+83;

const

WM_CAP_PAL_MANUALCREATE=(WM_CAP_START+84;

//FollowingaddedpostVFW1.1

const

WM_CAP_SET_CALLBACK_CAPCONTROL=(WM_CAP_START+85;//Definesendofthemessagerange

const

WM_CAP_END=WM_CAP_SET_CALLBACK_CAPCONTROL;

//------------------------------------------------------------------

//structures

//------------------------------------------------------------------

type

tagCapDriverCaps=packedrecord

wDeviceIndex:

word;//Driverindexinsystem.ini

fHasOverlay:

wordbool;//Candeviceoverlay?

fHasDlgVideoSource:

wordbool;//HasVideosourcedlg?

fHasDlgVideoFormat:

wordbool;//HasFormatdlg?

fHasDlgVideoDisplay:

wordbool;//HasExternaloutdlg?

fCaptureInitialized:

wordbool;//Driverreadytocapture?

fDriverSuppliesPalettes:

wordbool;//Candrivermakepalettes?

hVideoIn:

HVIDEO;//DriverInchannel

hVideoOut:

HVIDEO;//DriverOutchannel

hVideoExtIn:

HVIDEO;//DriverExtInchannel

hVideoExtOut:

HVIDEO;//DriverExtOutchannel

end;

CAPDRIVERCAPS=tagCapDriverCaps;

PCAPDRIVERCAPS=^tagCapDriverCaps;

LPCAPDRIVERCAPS=^tagCapDriverCaps;

type

tagCapStatus=record

uiImageWidth:

UInt;//Widthoftheimage

uiImageHeight:

UInt;//Heightoftheimage

fLiveWindow:

longbool;//NowPreviewingvideo?

fOverlayWindow:

longbool;//NowOverlayingvideo?

fScale:

longbool;//Scaleimagetoclient?

ptScroll:

POINT;//Scrollposition

fUsingDefaultPalette:

longbool;//Usingdefaultdriverpalette?

fAudioHardware:

longbool;//Audiohardwarepresent?

fCapFileExists:

longbool;//Doescapturefileexist?

dwCurrentVideoFrame:

DWORD;//#ofvideoframescap'td

dwCurrentVideoFramesDropped:

DWORD;//#ofvideoframesdroppeddwCurrentWaveSamples:

DWORD;//#ofwavesamplescap'td

dwCurrentTimeElapsedMS:

DWORD;//Elapsedcaptureduration

hPalCurrent:

HPALETTE;//Currentpaletteinuse

fCapturingNow:

longbool;//Captureinprogress?

dwReturn:

DWORD;//Errorvalueafteranyoperation

wNumVideoAllocated:

word;//Actualnumberofvideobuffers

wNumAudioAllocated:

word;//Actualnumberofaudiobuffers

end;

CAPSTATUS=tagCapStatus;

PCAPSTATUS=^tagCapStatus;

LPCAPSTATUS=^tagCapStatus;

//Defaultvaluesinparenthesis

type

tagCaptureParms=record

dwRequestMicroSecPerFrame:

DWORD;//Requestedcapturerate

fMakeUserHitOKToCapture:

longbool;//Show"HitOKtocap"dlg?

wPercentDropForError:

word;//Giveerrormsgif>(10%

fYield:

longbool;//Captureviabackgroundtask?

dwIndexSize:

DWORD;//Maxindexsizeinframes(32K

wChunkGranularity:

word;//Junkchunkgranularity(2K

fUsingDOSMemory:

longbool;//UseDOSbuffers?

wNumVideoRequested:

word;//#videobuffers,If0,autocalc

fCaptureAudio:

longbool;//Captureaudio?

wNumAudioRequested:

word;//#audiobuffers,If0,autocalc

vKeyAbort:

word;//Virtualkeycausingabort

fAbortLeftMouse:

longbool;//Abortonleftmouse?

fAbortRightMouse:

longbool;//Abortonrightmouse?

fLimitEnabled:

longbool;//UsewTimeLimit?

wTimeLimit:

word;//Secondstocapture

fMCIControl:

longbool;//UseMCIvideosource?

fStepMCIDevice:

longbool;//StepMCIdevice?

dwMCIStartTime:

DWORD;//TimetostartinMS

dwMCIStopTime:

DWORD;//TimetostopinMS

fStepCaptureAt2x:

longbool;//Performspatialaveraging2x

wStepCaptureAverageFrames:

word;//TemporalaveragenFrames

dwAudioBufferSize:

DWORD;//Sizeofaudiobufs(0:

default

fDisableWriteCache:

longbool;//Attempttodisablewritecache

end;

CAPTUREPARMS=tagCaptureParms;

PCAPTUREPARMS=^tagCaptureParms;

LPCAPTUREPARMS=^tagCaptureParms;

type

tagCapInfoChunk=record

fccInfoID:

FOURCC;//ChunkID,"ICOP"forcopyright

lpData:

LPVOID;//poSmallIntertodata

cbData:

integer;//sizeoflpData

end;

CAPINFOCHUNK=tagCapInfoChunk;

PCAPINFOCHUNK=^tagCapInfoChunk;

LPCAPINFOCHUNK=^tagCapInfoChunk;

//TypeTVideoHDRisnotpresentinavicap32..wemightneeditsoweaddittype

TVideoHDR=record

lpData:

Pointer{LPBYTE};//*pointertolockeddatabuffer*/

dwBufferLength:

DWord;//*Lengthofdatabuffer*/

dwBytesUsed:

DWord;//*Bytesactuallyused*/

dwTimeCaptured:

DWord;//*Millisecondsfromstartofstream*/

dwUser:

DWord;//*forclient'suse*/

dwFlags:

DWord;//assortedflags(seedefines*/

dwReserved{[4]}:

DWord;//*reservedfordriver*/

end;

PVideoHDR=^TVideoHDR;

LPVi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1