视频捕捉程序开发的基本步骤精.docx
- 文档编号:23353325
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:34
- 大小:24.20KB
视频捕捉程序开发的基本步骤精.docx
《视频捕捉程序开发的基本步骤精.docx》由会员分享,可在线阅读,更多相关《视频捕捉程序开发的基本步骤精.docx(34页珍藏版)》请在冰豆网上搜索。
视频捕捉程序开发的基本步骤精
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 视频 捕捉 程序 开发 基本 步骤