视频捕捉程序开发的基本步骤
- 格式:doc
- 大小:89.00 KB
- 文档页数:26
开发原则要使用ARToolKit开发应用有两个部分:编写应用程序,以及训练对增强现实应用中所用到的真实世界标志的图像处理例程。
使用ARToolKit编写应用是很简单的:新建一个AR应用需要一个简单的框架。
我们在这个框架的基础上编写新的应用。
同样地,因为应用这个简单的框架,训练模板的过程也被简化。
一个应用程序的主代码必须包含以下步骤:第二步到第五步一直重复,直到应用程序退出。
但是步骤一和步骤六只分别在应用程序的初始化时和关闭时才执行。
除了这些步骤之外,一个应用程序还应该对鼠标、键盘或者其他的特殊事件响应。
下一页将详细介绍各个步骤,再接着是讲解如何训练标识(还有处理多个标识的情况)。
开发你的第一个程序:第一部分IntroductionmaininitmainLoopdrawcleanup介绍为了详细地示范怎么样开发一个ARToolKit的应用,我们将一步步地介绍一个现有的例程的源代码:simpleTest(或者在有的版本里是simple)。
可以在目录examples/simple/里找到这个程序。
程序simpleTest我们要找的文件名字是simpleTest.c (或者simple.c )。
这个程序仅仅包含了一个主函数和几个绘制图像的函数。
相应于上节介绍的六个应用步骤的函数列出在表1中。
相应于步骤二到步骤五的函数在mainLoop 函数(主循环)中被调用。
表格1:相应于ARToolKit应用程序步骤的函数调用和代码在这个程序中,最重要的函数是main ,init , mainloop ,draw和cleanup。
在本节的其他部分我们将详细地解释这些函数调用。
mainSimple例程中main函数的流程如下所示:其中的初始化例程init包含的代码可以初始化视频捕捉,读取标识卡信息和摄像机参数信息,以及设置图像窗口。
这相对于《开发原则》中的第一步。
接下来,我们通过调用视频开始函数arVideoCapStart输入实时状态。
VFW视频采集方案VFW是Microsoft于1992年推出的数字视频软件包,它不依赖于专用的硬件设备,提供了通用的数字视频开发方案。
VFW主要由、、、、等库文件组成,这些库提供了相关视频、音频、AVI文件的函数,本节将介绍如何利用这些函数进行视频采集。
2.2.1 开发流程分析VFW使用的视频函数被封装在库文件中,该库文件默认情况下没有被连接到MFC工程中,因此使用VFW进行视频开发的第一步是导入库文件。
方法如下:(1)引用头文件。
#include ""(2)导入库文件。
#pragma comment (lib,"vfw32")步骤2也可以在通过工程选项窗口的连接选项卡进行设置。
如图所示。
连接库文件图工程选项窗口在导入库文件后便可以使用视频函数了。
首先调用capCreateCaptureWindow函数创建具有WS_POPUP风格的视频捕捉窗口。
然后调用capDriverConnect函数连接驱动程序,设置视频捕捉窗口的大小、显示位置。
最后调用capPreviewRate函数设置预览速率,调用capPre view函数进行视频预览。
总结上述流程分析,VFW视频捕捉开发流程具体步骤如下:(1)引用“”头文件并导入库。
(2)创建一个线程,在线程函数中调用capCreateCaptureWindow创建视频捕捉窗口。
(3)调用capDriverConnect连接驱动程序,设置视频捕捉窗口风格、大小及父窗口。
(4)调用capPreviewRate函数设置预览速度,调用capPreview函数开始预览。
2.2.2 视频窗口创建在进行视频程序开发时,第一步需要创建一个视频预览窗口。
在程序中可以使用capCreate CaptureWindow函数来创建视频预览窗口,该函数语法如下:HWND VFWAPI capCreateCaptureWindow(LPCSTR lpszWindowName, DWORD dwStyle, int x,int y, int nWidth, int nHeight, HWND hWnd, int nID);参数说明:lpszWindowName:表示视频捕捉窗口的名称。
我们知道目前很多工业相机的图像数据采集都是基于DirectShow的,常见的有映美精等。
DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。
DirectShow为多媒体流的捕捉和回放提供了强有力的支持。
运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。
它广泛地支持各种媒体格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒体数据的回放变得轻而易举。
另外,DirectShow还集成了DirectX其它部分(比如DirectDraw、DirectSound)的技术,直接支持DVD的播放,视频的非线性编辑,以及与数字摄像机的数据交换。
更值得一提的是,DirectShow提供的是一种开放式的开发环境,我们可以根据自己的需要定制自己的组件。
笔者使用visual studio 2005 来开发了基于DirectShow的视频捕获软件,并用开发的软件对映美精相机进行了测试。
本软件不但可以实现对相机的视频捕获,而且还可以抓取图像帧。
软件运行时自动搜索所连接的相机,预览后可以对相机参数进行设置。
下面是软件的主界面。
预览视频后可以对视频格式和图像参数进行设置。
开始预览时,捕获的视频是黑白的,我们将颜色空间设置为UYVY即可捕获彩色视频。
下面是捕获的一帧图像,图像质量虽然没有映美精自带的软件效果好,但已经实现了所需各项基本功能,接下来的工作将会进一步提高软件性能。
另外我们还可以捕获视频,点击“捕获视频”按钮,输入要保持的文件名,注意要以.avi后缀结尾,点确定就开始捕获视频。
从我们开发的软件可以看到,映美精的相机能够很好的支持DirectShow的驱动,我们的软件对映美精相机的识别是如此的容易。
接下来我们将继续开发基于其它驱动的图像捕获软件,为最终实现在一个软件中识别各种相机而努力。
c++ 编写连接摄像头的通用方法【摄像头连接概述】在本文中,我们将介绍一种通用的C++编写连接摄像头的方法。
摄像头连接主要包括以下几个步骤:准备工作、实现通用连接方法、代码示例及解析、总结与拓展。
通过本文,读者可以了解到如何使用C++编写程序实现摄像头连接,并实现基本视频捕捉功能。
【准备工作】在进行摄像头连接之前,我们需要做好以下准备工作:1.安装适当的驱动程序:根据摄像头型号和操作系统,确保安装了正确的驱动程序。
2.导入必要的库:我们需要使用一些库来实现摄像头连接,如OpenCV。
在使用OpenCV之前,需要先安装相应版本的库文件。
3.配置开发环境:安装C++编译器,并配置好开发环境。
【实现通用连接方法】在C++中,我们可以使用以下通用方法连接摄像头:1.初始化库:引入OpenCV库,并初始化cv::VideoCapture对象。
2.打开摄像头:使用cv::VideoCapture::open()方法尝试打开摄像头。
3.检查摄像头是否成功打开:通过检查cv::VideoCapture对象的是否为null来判断摄像头是否成功打开。
4.释放资源:在程序结束时,释放摄像头资源,关闭cv::VideoCapture对象。
【代码示例及解析】以下是一个简单的C++代码示例,演示了如何实现摄像头连接:```cpp#include <iostream>#include <opencv2/opencv.hpp>int main() {// 初始化库cv::Mat frame;cv::VideoCapture cap(0); // 0表示默认摄像头// 检查摄像头是否成功打开if (!cap.isOpened()) {std::cout << "摄像头未打开,请检查摄像头是否正确连接。
" << std::endl;return -1;}// 循环捕获并显示画面while (true) {cap >> frame;if (frame.empty()) {std::cout << "未捕获到画面,请检查摄像头是否正常工作。
obs原理范文OBS(Open Broadcaster Software)是一种开源的实时视频流和屏幕录制工具,广泛应用于直播、游戏实况转播和视频剪辑等领域。
它的原理是通过捕捉屏幕上的视频和音频,并将其编码后进行实时传输或保存。
在这篇文章中,我们将详细介绍OBS的原理及其工作流程。
OBS的原理主要分为两个部分:视频捕捉和编码传输。
首先,视频捕捉是OBS的核心功能之一、它通过捕捉显示器上的视频内容,获取屏幕上的图像信息。
这个过程主要依赖于操作系统提供的API (Application Programming Interface)来读取屏幕的像素信息。
OBS在不同的操作系统下使用不同的API,如DirectX API或OpenGL API等。
通过读取屏幕上的像素信息,OBS可以实时获取到屏幕内容的图像数据。
接下来是编码传输过程。
由于视频文件通常占用大量的存储空间,为了降低文件大小和提高传输效率,需要对视频进行编码。
OBS使用各种编码器,如x264、NVENC(NVIDIA编码器)等,将屏幕捕捉到的图像数据进行压缩编码。
编码过程主要包括两个步骤:压缩和打包。
压缩是通过丢弃部分图像信息以减少冗余数据来降低文件大小。
打包则是将压缩后的数据进行整理和封装,以便于传输或保存。
在编码完成后,OBS将编码后的视频数据传输到指定的位置。
传输的方式可以是实时传输,例如直播平台,也可以是保存到本地硬盘或其他存储介质中,以便日后使用。
在传输过程中,OBS使用网络协议(如RTMP、SRT等)将视频数据发送到指定的服务器端或存储设备中。
除了视频捕捉和编码传输外,OBS还提供了其他一些功能,如音频捕捉、混音等。
音频捕捉过程与视频捕捉类似,也是通过操作系统提供的API来获取系统的音频输出。
通过音频捕捉,OBS可以将音频和视频进行同步,以实现完整的视频流。
综上所述,OBS工作的原理主要包括视频捕捉、视频编码和传输三个关键步骤。
通过捕捉屏幕上的视频和音频,OBS将其编码压缩后进行传输或保存。
2 视频捕捉程序开发的基本步骤2.1 使用AVICap窗口类笔者使用的是AVICap窗口类来开发视频捕捉程序。
AVICap类支持实时视频流捕捉和单帧捕捉,并提供对视频源的控制。
通常使用的MCI控件虽然也提供了数字视频服务。
并为视频叠加提供了Overlay命令集等,但这些命令主要是基于文件的操作,还不能满足实时地从视频缓存中提取数据的要求。
对于使用没有视频叠加能力的捕捉卡的PC机来说,用MCI提供的命令集是无法捕捉视频流的。
而AVICap窗口类在捕捉视频方面具有一定的优势,它能直接访问视频缓冲区,而不需要生成中间文件,因而实时性很强,效率也很高。
另外,它还可将数字视频捕捉到一个文件中。
2.2 开发的基本步骤开发视频捕捉程序主要有以下四个步骤:(1)创建“捕捉窗”。
在进行视频捕捉之前必需要先创建一个“捕捉窗”,并应以此为基础进行所有的捕捉及设置操作。
“捕捉窗”可用AVICap窗口类的“Cap Create Capture Window”函数来创建,其窗口风格可设置为WSCHILD和WS_VISIBLE参数。
“捕捉窗”类似于标准控件,它具有下列功能:将视频流和音频流捕捉到一个AVI文件中;动态地同视频和音频输入器件连接或断开;以Overlay或Preview模式对输入的视频流进行实时显示;在捕捉时,可指定所用的文件名,并可将捕捉文件的内容拷贝到另一个文件;设置捕捉速率;显示控制视频源、视频格式及视频压缩的对话框;创建、保存或载入调色板;将图像和相关的调色板拷贝到剪贴板;将捕捉的单帧图像保存到DIB格式文件。
(2)关联捕捉窗和驱动程序单独定义的捕捉窗是不能工作的,它须与一个设备相关联才能取得视频信号。
用函数CapDriver Connect可使捕捉窗与其设备驱动程序相关联。
(3)设置视频设备的属性通过设置TcaptureParms结构变量的各个成员变量,可以控制设备的采样频率、中断采样按键、状态行为。
设置好TcaptureParms结构变量后,可以用函CapCaptureSetSetup 使设置生效。
之后还可以用CapPreviewScale、CapPreviewRate设置预览的比例与速度,也可以直接使用设备的默认值。
(4)打开预览利用函数CapOverlay可选择是否采用叠加模式预览,以使系统资源占用小,视频显示速度加快。
然后用CapPreview启动预览功能,这时就可以在屏幕上看到来自摄像机的图像了。
通过以上四步就可以建立一个基本的视频捕捉程序,但假如想自己处理从设备捕捉到的视频数据,则要使用捕捉窗回调函数来处理,比如一帧一帧地获得视频数据或以流的方式获得视频数据等。
3 基于Delphi的视频捕捉程序根据系统对系统访问、处理速度等方面的非凡需求,笔者选用Delphi作为开发工具。
下面以开发一个逐帧从视频设备上捕捉视频数据的程序为例,来说明每个函数的作用以及开发的具体过程。
所给例程的功能是可以在屏幕上显示捕捉到的视频,并可以获得每一帧的图像数据。
具体步骤如下:(1)新建一个工程,并将AVICAP32.PAS包含到USES中。
{PASCAL INTERFACE for AVICAP32 DLL}{Converted from microsoft Header file by ArTee}{Free to use - I'm NOT responsible fo bugs}unit avicap32;interfaceuses Windows, Messages, SysUtils, MMSystem;//This part might be buggy.//It 'Assumes' types because I cannot find the correct unittypeHVIDEO = longword; //Handle;UINT = longword;POINT = recordx, y: integerend;LPPOINT = ^POINT;FOURCC = recordc1, c2, c3, c4: char;end;mmioFOURCC = FOURCC;LPVOID = Pointer;//LPWAVEHDR, LPVIDEOHDR worden gebruikt in de call-back functions! ik heb ze maar gereplaced met integers.{************************************************************* **************** avicap.h** Main include file.** Microsoft Video for Windows Sample Capture Class** Copyright (c) 1992, 1993 Microsoft Corporation. All Rights Reserved.** You have a royalty-free right to use, modify, reproduce and* distribute the Sample Files (and/or any modified version) in* any way you find useful, provided that you agree that* Microsoft has no warranty obligations or liability for any* Sample Application Files which are modified.************************************************************** *************}//const AVICapSM =SendMessage; { SendMessage in C }// ------------------------------------------------------------------// Window Messages WM_CAP... which can be sent to an AVICAP window // ------------------------------------------------------------------// Defines start of the message rangeconstWM_CAP_START = WM_USER;constWM_CAP_GET_CAPSTREAMPTR = (WM_CAP_START + 1);constWM_CAP_SET_CALLBACK_ERROR = (WM_CAP_START + 2);constWM_CAP_SET_CALLBACK_STATUS = (WM_CAP_START + 3);constWM_CAP_SET_CALLBACK_YIELD = (WM_CAP_START + 4);constWM_CAP_SET_CALLBACK_FRAME = (WM_CAP_START + 5);constWM_CAP_SET_CALLBACK_VIDEOSTREAM = (WM_CAP_START + 6); constWM_CAP_SET_CALLBACK_WAVESTREAM = (WM_CAP_START + 7); constWM_CAP_GET_USER_DATA = (WM_CAP_START + 8);constWM_CAP_SET_USER_DATA = (WM_CAP_START + 9);constWM_CAP_DRIVER_CONNECT = (WM_CAP_START + 10);constWM_CAP_DRIVER_DISCONNECT = (WM_CAP_START + 11);constWM_CAP_DRIVER_GET_NAME = (WM_CAP_START + 12);constWM_CAP_DRIVER_GET_VERSION = (WM_CAP_START + 13);constWM_CAP_DRIVER_GET_CAPS = (WM_CAP_START + 14);constWM_CAP_FILE_SET_CAPTURE_FILE = (WM_CAP_START + 20);constWM_CAP_FILE_GET_CAPTURE_FILE = (WM_CAP_START + 21);WM_CAP_FILE_ALLOCATE = (WM_CAP_START + 22);constWM_CAP_FILE_SAVEAS = (WM_CAP_START + 23);constWM_CAP_FILE_SET_INFOCHUNK = (WM_CAP_START + 24); constWM_CAP_FILE_SAVEDIB = (WM_CAP_START + 25);constWM_CAP_EDIT_COPY = (WM_CAP_START + 30);constWM_CAP_SET_AUDIOFORMAT = (WM_CAP_START + 35);constWM_CAP_GET_AUDIOFORMAT = (WM_CAP_START + 36);constWM_CAP_DLG_VIDEOFORMAT = (WM_CAP_START + 41);constWM_CAP_DLG_VIDEOSOURCE = (WM_CAP_START + 42);constWM_CAP_DLG_VIDEODISPLAY = (WM_CAP_START + 43); constWM_CAP_GET_VIDEOFORMAT = (WM_CAP_START + 44);constWM_CAP_SET_VIDEOFORMAT = (WM_CAP_START + 45);constWM_CAP_DLG_VIDEOCOMPRESSION = (WM_CAP_START + 46); constWM_CAP_SET_PREVIEW = (WM_CAP_START + 50);constWM_CAP_SET_OVERLAY = (WM_CAP_START + 51);constWM_CAP_SET_PREVIEWRATE = (WM_CAP_START + 52);constWM_CAP_SET_SCALE = (WM_CAP_START + 53);constWM_CAP_GET_STATUS = (WM_CAP_START + 54);constWM_CAP_SET_SCROLL = (WM_CAP_START + 55);constWM_CAP_GRAB_FRAME = (WM_CAP_START + 60);WM_CAP_GRAB_FRAME_NOSTOP = (WM_CAP_START + 61);constWM_CAP_SEQUENCE = (WM_CAP_START + 62);constWM_CAP_SEQUENCE_NOFILE = (WM_CAP_START + 63);constWM_CAP_SET_SEQUENCE_SETUP = (WM_CAP_START + 64); constWM_CAP_GET_SEQUENCE_SETUP = (WM_CAP_START + 65); constWM_CAP_SET_MCI_DEVICE = (WM_CAP_START + 66);constWM_CAP_GET_MCI_DEVICE = (WM_CAP_START + 67);constWM_CAP_STOP = (WM_CAP_START + 68);constWM_CAP_ABORT = (WM_CAP_START + 69);constWM_CAP_SINGLE_FRAME_OPEN = (WM_CAP_START + 70);constWM_CAP_SINGLE_FRAME_CLOSE = (WM_CAP_START + 71);constWM_CAP_SINGLE_FRAME = (WM_CAP_START + 72);constWM_CAP_PAL_OPEN = (WM_CAP_START + 80);constWM_CAP_PAL_SAVE = (WM_CAP_START + 81);constWM_CAP_PAL_PASTE = (WM_CAP_START + 82);constWM_CAP_PAL_AUTOCREATE = (WM_CAP_START + 83);constWM_CAP_PAL_MANUALCREATE = (WM_CAP_START + 84);// Following added post VFW 1.1constWM_CAP_SET_CALLBACK_CAPCONTROL = (WM_CAP_START + 85); // Defines end of the message rangeconstWM_CAP_END = WM_CAP_SET_CALLBACK_CAPCONTROL;// ------------------------------------------------------------------// structures// ------------------------------------------------------------------typetagCapDriverCaps = packed recordwDeviceIndex: word; // Driver index in system.inifHasOverlay: wordbool; // Can device overlay?fHasDlgVideoSource: wordbool; // Has Video source dlg?fHasDlgVideoFormat: wordbool; // Has Format dlg?fHasDlgVideoDisplay: wordbool; // Has External out dlg?fCaptureInitialized: wordbool; // Driver ready to capture?fDriverSuppliesPalettes: wordbool; // Can driver make palettes?hVideoIn: HVIDEO; // Driver In channelhVideoOut: HVIDEO; // Driver Out channelhVideoExtIn: HVIDEO; // Driver Ext In channelhVideoExtOut: HVIDEO; // Driver Ext Out channelend;CAPDRIVERCAPS = tagCapDriverCaps;PCAPDRIVERCAPS = ^tagCapDriverCaps;LPCAPDRIVERCAPS = ^tagCapDriverCaps;typetagCapStatus = recorduiImageWidth: UInt; // Width of the imageuiImageHeight: UInt; // Height of the imagefLiveWindow: longbool; // Now Previewing video?fOverlayWindow: longbool; // Now Overlaying video?fScale: longbool; // Scale image to client?ptScroll: POINT; // Scroll positionfUsingDefaultPalette: longbool; // Using default driver palette?fAudioHardware: longbool; // Audio hardware present?fCapFileExists: longbool; // Does capture file exist?dwCurrentVideoFrame: DWORD; // # of video frames cap'tddwCurrentVideoFramesDropped: DWORD; // # of video frames dropped dwCurrentWaveSamples: DWORD; // # of wave samples cap'tddwCurrentTimeElapsedMS: DWORD; // Elapsed capture durationhPalCurrent: HPALETTE;// Current palette in usefCapturingNow: longbool; // Capture in progress?dwReturn: DWORD; // Error value after any operationwNumVideoAllocated: word; // Actual number of video bufferswNumAudioAllocated: word; // Actual number of audio buffersend;CAPSTATUS = tagCapStatus;PCAPSTATUS = ^tagCapStatus;LPCAPSTATUS = ^tagCapStatus;// Default values in parenthesistypetagCaptureParms = recorddwRequestMicroSecPerFrame: DWORD; // Requested capture ratefMakeUserHitOKToCapture: longbool; // Show "Hit OK to cap" dlg?wPercentDropForError: word; // Give error msg if > (10%)fYield: longbool; // Capture via background task?dwIndexSize: DWORD; // Max index size in frames (32K)wChunkGranularity: word; // Junk chunk granularity (2K)fUsingDOSMemory: longbool; // Use DOS buffers?wNumVideoRequested: word; // # video buffers, If 0, autocalcfCaptureAudio: longbool; // Capture audio?wNumAudioRequested: word; // # audio buffers, If 0, autocalcvKeyAbort: word; // Virtual key causing abortfAbortLeftMouse: longbool; // Abort on left mouse?fAbortRightMouse: longbool; // Abort on right mouse?fLimitEnabled: longbool; // Use wTimeLimit?wTimeLimit: word; // Seconds to capturefMCIControl: longbool; // Use MCI video source?fStepMCIDevice: longbool; // Step MCI device?dwMCIStartTime: DWORD; // Time to start in MSdwMCIStopTime: DWORD; // Time to stop in MSfStepCaptureAt2x: longbool; // Perform spatial averaging 2xwStepCaptureAverageFrames: word; // Temporal average n FramesdwAudioBufferSize: DWORD; // Size of audio bufs (0 : default)fDisableWriteCache: longbool; // Attempt to disable write cacheend;CAPTUREPARMS = tagCaptureParms;PCAPTUREPARMS = ^tagCaptureParms;LPCAPTUREPARMS = ^tagCaptureParms;typetagCapInfoChunk = recordfccInfoID: FOURCC; // Chunk ID, "ICOP" for copyrightlpData: LPVOID; // poSmallInter to datacbData: integer; // size of lpDataend;CAPINFOCHUNK = tagCapInfoChunk;PCAPINFOCHUNK = ^tagCapInfoChunk;LPCAPINFOCHUNK = ^tagCapInfoChunk;//Type TVideoHDR is not present in avicap32.. we might need it so we add it typeTVideoHDR = recordlpData: Pointer {LPBYTE}; //* pointer to locked data buffer */dwBufferLength: DWord; //* Length of data buffer */dwBytesUsed: DWord; //* Bytes actually used */dwTimeCaptured: DWord; //* Milliseconds from startof stream */dwUser: DWord; //* for client's use */dwFlags: DWord; // assorted flags(see defines)*/dwReserved{[4]}: DWord; //* reserved for driver */end;PVideoHDR = ^TVideoHDR;LPVideoHDR = PVideoHDR;//* dwFlags field of VIDEOHDR */constVHDR_DONE = $00000001; //* Done bit */constVHDR_PREPARED = $00000002; //* Set if this header has been prepared */ constVHDR_INQUEUE = $00000004; //* Reserved for driver */constVHDR_KEYFRAME = $00000008; //* Key Frame */// ------------------------------------------------------------------// Callback Definitions// ------------------------------------------------------------------//Nog zo'n mooi stukkie dat ik ff laat zitten.// componentje van maken, zelf de callback doen.typeCAPYIELDCALLBACK = function(hWnd: HWND): LRESULT; stdcall;typeCAPSTATUSCALLBACK = function(hWnd: HWND; nID: smallint;lpsz: LPCSTR): LRESULT; stdcall;typeCAPERRORCALLBACK = function(hWnd: HWND; nID: smallint; lpsz: LPCSTR): LRESULT; stdcall;typeCAPVIDEOCALLBACK = function(hWnd: HWND; lpVHdr:integer{LPVIDEOHDR}): LRESULT;stdcall;typeCAPWAVECALLBACK = function(hWnd: HWND; lpWHdr:integer{LPWAVEHDR}): LRESULT;stdcall;typeCAPCONTROLCALLBACK = function(hWnd: HWND; nState: smallint): LRESULT; stdcall;// ------------------------------------------------------------------// CapControlCallback states// ------------------------------------------------------------------constCONTROLCALLBACK_PREROLL = 1; { Waiting to start capture }constCONTROLCALLBACK_CAPTURING = 2; { Now capturing }// ------------------------------------------------------------------// The only exported functions from AVICAP.DLL// ------------------------------------------------------------------function {VFWAPI} capCreateCaptureWindow(lpszWindowName: LPCSTR; dwStyle: DWORD; x, y, nWidth, nHeight: integer; hwndParent: HWND; nID: integer): HWND; stdcall;external 'AVICAP32.DLL' Name 'capCreateCaptureWindowA';function {VFWAPI} capGetDriverDescription(wDriverIndex: word; lpszName: LPSTR; cbName: integer; lpszVer: LPSTR; cbVer: integer): longbool;stdcall; external 'AVICAP32.DLL' Name 'capGetDriverDescriptionA';// ------------------------------------------------------------------// New Information chunk IDs// ------------------------------------------------------------------constinfotypeDIGITIZATION_TIME = ('IDIT');constinfotypeSMPTE_TIME = ('ISMP');// ------------------------------------------------------------------// String IDs from status and error callbacks// ------------------------------------------------------------------constIDS_CAP_BEGIN = 300; { "Capture Start" }constIDS_CAP_END = 301; { "Capture End" }constIDS_CAP_INFO = 401; { "%s" }constIDS_CAP_OUTOFMEM = 402; { "Out of memory" }constIDS_CAP_FILEEXISTS = 403; { "File '%s' exists -- overwrite it?" }constIDS_CAP_ERRORPALOPEN = 404; { "Error opening palette '%s'" }constIDS_CAP_ERRORPALSAVE = 405; { "Error saving palette '%s'" }constIDS_CAP_ERRORDIBSAVE = 406; { "Error saving frame '%s'" }constIDS_CAP_DEFAVIEXT = 407; { "avi" }constIDS_CAP_DEFPALEXT = 408; { "pal" }constIDS_CAP_CANTOPEN = 409; { "Cannot open '%s'" }constIDS_CAP_SEQ_MSGSTART = 410;{ "Select OK to start capture\nof video sequence\nto %s." }constIDS_CAP_SEQ_MSGSTOP = 411; { "Hit ESCAPE or click to end capture" } constIDS_CAP_VIDEDITERR = 412; { "An error occurred while trying to run VidEdit." }constIDS_CAP_READONLYFILE = 413; { "The file '%s' is a read-only file." } constIDS_CAP_WRITEERROR = 414; { "Unable to write to file '%s'.\nDisk may be full." }constIDS_CAP_NODISKSPACE = 415;{ "There is no space to create a capture file on the specified device." }constIDS_CAP_SETFILESIZE = 416; { "Set File Size" }constIDS_CAP_SAVEASPERCENT = 417; { "SaveAs: %2ld%% Hit Escape to abort." }constIDS_CAP_DRIVER_ERROR = 418; { Driver specific error message }constIDS_CAP_WAVE_OPEN_ERROR = 419;{ "Error: Cannot open the wave input device.\nCheck sample size, frequency, and channels." }constIDS_CAP_WAVE_ALLOC_ERROR = 420; { "Error: Out of memory for wave buffers." }constIDS_CAP_WAVE_PREPARE_ERROR = 421; { "Error: Cannot prepare wave buffers." }constIDS_CAP_WAVE_ADD_ERROR = 422; { "Error: Cannot add wave buffers." } constIDS_CAP_WAVE_SIZE_ERROR = 423; { "Error: Bad wave size." }constIDS_CAP_VIDEO_OPEN_ERROR = 424; { "Error: Cannot open the video input device." }constIDS_CAP_VIDEO_ALLOC_ERROR = 425; { "Error: Out of memory for video buffers." }constIDS_CAP_VIDEO_PREPARE_ERROR = 426; { "Error: Cannot prepare video buffers." }constIDS_CAP_VIDEO_ADD_ERROR = 427; { "Error: Cannot add video buffers." } constIDS_CAP_VIDEO_SIZE_ERROR = 428; { "Error: Bad video size." }constIDS_CAP_FILE_OPEN_ERROR = 429; { "Error: Cannot open capture file." } constIDS_CAP_FILE_WRITE_ERROR = 430;{ "Error: Cannot write to capture file. Disk may be full." }constIDS_CAP_RECORDING_ERROR = 431;{ "Error: Cannot write to capture file. Data rate too high or disk full." } constIDS_CAP_RECORDING_ERROR2 = 432; { "Error while recording" }constIDS_CAP_AVI_INIT_ERROR = 433; { "Error: Unable to initialize for capture." }constIDS_CAP_NO_FRAME_CAP_ERROR = 434;{ "Warning: No frames captured.\nConfirm that vertical sync SmallInterrupts\nare configured and enabled." }constIDS_CAP_NO_PALETTE_WARN = 435; { "Warning: Using default palette." } constIDS_CAP_MCI_CONTROL_ERROR = 436; { "Error: Unable to access MCI device." }constIDS_CAP_MCI_CANT_STEP_ERROR = 437; { "Error: Unable to step MCI device." }constIDS_CAP_NO_AUDIO_CAP_ERROR = 438;{ "Error: No audio data captured.\nCheck audio card settings." }constIDS_CAP_AVI_DRAWDIB_ERROR = 439; { "Error: Unable to draw this data format." }constIDS_CAP_COMPRESSOR_ERROR = 440; { "Error: Unable to initialize compressor." }constIDS_CAP_AUDIO_DROP_ERROR = 441;{ "Error: Audio data was lost during capture, reduce capture rate." }{ status string IDs }constIDS_CAP_STAT_LIVE_MODE = 500; { "Live window" }constIDS_CAP_STAT_OVERLAY_MODE = 501; { "Overlay window" }constIDS_CAP_STAT_CAP_INIT = 502; { "Setting up for capture - Please wait" } constIDS_CAP_STAT_CAP_FINI = 503; { "Finished capture, now writingframe %ld" }constIDS_CAP_STAT_PALETTE_BUILD = 504; { "Building palette map" }constIDS_CAP_STAT_OPTPAL_BUILD = 505; { "Computing optimal palette" } constIDS_CAP_STAT_I_FRAMES = 506; { "%d frames" }constIDS_CAP_STAT_L_FRAMES = 507; { "%ld frames" }constIDS_CAP_STAT_CAP_L_FRAMES = 508; { "Captured %ld frames" }constIDS_CAP_STAT_CAP_AUDIO = 509; { "Capturing audio" }constIDS_CAP_STAT_VIDEOCURRENT = 510; { "Captured %ld frames (%ld dropped) %d.%03d sec." }constIDS_CAP_STAT_VIDEOAUDIO = 511;{ "Captured %d.%03d sec. %ld frames (%ld dropped) (%d.%03d fps). %ld audio bytes (%d,%03d sps)" }constIDS_CAP_STAT_VIDEOONLY = 512;{ "Captured %d.%03d sec. %ld frames (%ld dropped) (%d.%03d fps)" } constIDS_CAP_STAT_FRAMESDROPPED = 513;{ "Dropped %ld of %ld frames (%d.%02d%%) during capture." }function capSetCallbackOnStatus(Handle: HWND; fpProc: Pointer): integer; function capSetCallbackOnYield(Handle: HWND; fpProc: Pointer): integer; function capSetCallbackOnFrame(Handle: HWND; fpProc: Pointer): integer; function capSetCallbackOnVideoStream(Handle: HWND; fpProc: Pointer): integer;function capSetCallbackOnWaveStream(Handle: HWND; fpProc: Pointer): integer;function capSetCallbackOnCapControl(Handle: HWND; fpProc: Pointer): integer; function capSetUserData(Handle: HWND; lUser: integer): integer;function capGetUserData(Handle: HWND): integer;function capDriverConnect(Handle: HWND; i: integer): integer;function capDriverDisconnect(Handle: HWND): integer;function capDriverGetName(Handle: HWND; szName: PChar; wSize: integer): integer;function capDriverGetVersion(Handle: HWND; szVer: integer; wSize: integer): integer;function capDriverGetCaps(Handle: HWND; s: LPCapDriverCaps; wSize: integer): integer;function capFileSetCaptureFile(Handle: HWND; szName: PChar): integer; function capFileGetCaptureFile(Handle: HWND; szName: PChar; wSize: integer): integer;function capFileAlloc(Handle: HWND; dwSize: integer): integer;function capFileSaveAs(Handle: HWND; szName: PChar): integer;function capFileSetInfoChunk(Handle: HWND; lpInfoChunk: LPCapInfoChunk): integer;function capFileSaveDIB(Handle: HWND; szName: PChar): integer;function capEditCopy(Handle: HWND): integer;function capSetAudioFormat(Handle: HWND; s: PWaveFormatEx; wSize: integer): integer;function capGetAudioFormat(Handle: HWND; s: PWaveFormatEx; wSize: integer): DWord;function capGetAudioFormatSize(Handle: HWND): DWord;function capDlgVideoFormat(Handle: HWND): integer;function capDlgVideoSource(Handle: HWND): integer;function capDlgVideoDisplay(Handle: HWND): integer;function capDlgVideoCompression(Handle: HWND): integer;function capGetVideoFormat(Handle: HWND; s: integer; wSize: integer): DWord;function capGetVideoFormatSize(Handle: HWND): DWord;function capSetVideoFormat(Handle: HWND; s: integer; wSize: integer): integer;function capPreview(Handle: HWND; f: longbool): integer;function capPreviewRate(Handle: HWND; wMS: integer): integer;function capOverlay(Handle: HWND; f: longbool): integer;function capPreviewScale(Handle: HWND; f: longbool): integer;function capGetStatus(Handle: HWND; s: LPCapStatus; wSize: integer): integer;function capSetScrollPos(Handle: HWND; lpP: LPPOINT): integer;function capGrabFrame(Handle: HWND): integer;function capGrabFrameNoStop(Handle: HWND): integer;function capCaptureSequence(Handle: HWND): integer;function capCaptureSequenceNoFile(Handle: HWND): integer;function capCaptureStop(Handle: HWND): integer;function capCaptureAbort(Handle: HWND): integer;function capCaptureSingleFrameOpen(Handle: HWND): integer;function capCaptureSingleFrameClose(Handle: HWND): integer;function capCaptureSingleFrame(Handle: HWND): integer;function capCaptureGetSetup(Handle: HWND; s: LPCaptureParms; wSize: integer): integer;function capCaptureSetSetup(Handle: HWND; s: LPCaptureParms; wSize: integer): integer;function capSetMCIDeviceName(Handle: HWND; szName: PChar): integer; function capGetMCIDeviceName(Handle: HWND; szName: PChar; wSize: integer): longbool;function capPaletteOpen(Handle: HWND; szName: PChar): integer; function capPaletteSave(Handle: HWND; szName: PChar): integer; function capPalettePaste(Handle: HWND): integer;function capPaletteAuto(Handle: HWND; iFrames: integer; iColors: integer): integer;function capPaletteManual(Handle: HWND; fGrab: integer; iColors: integer): integer;implementation// ------------------------------------------------------------------// Message crackers for above// ------------------------------------------------------------------//Leuk, maar dat moet dan richting implemenation...function capSetCallbackOnError(hwnd: integer; fpProc: Pointer): integer; beginResult := sendmessage(hwnd, WM_CAP_SET_CALLBACK_ERROR, 0,integer(fpProc));end;function capSetCallbackOnStatus(Handle: HWND; fpProc: Pointer): integer; beginResult := sendmessage(handle, WM_CAP_SET_CALLBACK_STATUS, 0, integer(fpProc));end;function capSetCallbackOnYield(Handle: HWND; fpProc: Pointer): integer; beginResult := sendmessage(handle, WM_CAP_SET_CALLBACK_YIELD, 0,integer(fpProc));end;function capSetCallbackOnFrame(Handle: HWND; fpProc: Pointer): integer; beginResult := sendmessage(handle, WM_CAP_SET_CALLBACK_FRAME, 0, integer(fpProc));end;function capSetCallbackOnVideoStream(Handle: HWND; fpProc: Pointer): integer;beginResult := sendmessage(handle, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, integer(fpProc));end;function capSetCallbackOnWaveStream(Handle: HWND; fpProc: Pointer): integer;beginResult := sendmessage(handle, WM_CAP_SET_CALLBACK_WAVESTREAM, 0, integer(fpProc));end;function capSetCallbackOnCapControl(Handle: HWND; fpProc: Pointer): integer; beginResult := sendmessage(handle, WM_CAP_SET_CALLBACK_CAPCONTROL, 0, integer(fpProc));end;function capSetUserData(Handle: HWND; lUser: integer): integer;beginResult := sendmessage(handle, WM_CAP_SET_USER_DATA, 0, lUser); end;function capGetUserData(Handle: HWND): integer;beginResult := sendmessage(handle, WM_CAP_GET_USER_DATA, 0, 0);end;function capDriverConnect(Handle: HWND; i: integer): integer;beginResult := sendmessage(handle, WM_CAP_DRIVER_CONNECT, i, 0);end;function capDriverDisconnect(Handle: HWND): integer;beginResult := sendmessage(handle, WM_CAP_DRIVER_DISCONNECT, 0, 0); end;function capDriverGetName(Handle: HWND; szName: PChar; wSize: integer): integer;beginResult := sendmessage(handle, WM_CAP_DRIVER_GET_NAME, (wSize), integer(szName));end;function capDriverGetVersion(Handle: HWND; szVer: integer; wSize: integer): integer;beginResult := sendmessage(handle, WM_CAP_DRIVER_GET_VERSION, (wSize), (szVer));end;function capDriverGetCaps(Handle: HWND; s: LPCapDriverCaps; wSize: integer): integer;beginResult := sendmessage(handle, WM_CAP_DRIVER_GET_CAPS, (wSize), integer(s));end;function capFileSetCaptureFile(Handle: HWND; szName: PChar): integer; beginResult := sendmessage(handle, WM_CAP_FILE_SET_CAPTURE_FILE, 0,integer(szName));end;function capFileGetCaptureFile(Handle: HWND; szName: PChar; wSize: integer): integer;beginResult := sendmessage(handle, WM_CAP_FILE_GET_CAPTURE_FILE, (wSize), integer(szName));end;function capFileAlloc(Handle: HWND; dwSize: integer): integer;beginResult := sendmessage(handle, WM_CAP_FILE_ALLOCATE, 0, (dwSize)); end;function capFileSaveAs(Handle: HWND; szName: PChar): integer;beginResult := sendmessage(handle, WM_CAP_FILE_SAVEAS, 0,integer(szName));end;function capFileSetInfoChunk(Handle: HWND; lpInfoChunk: LPCapInfoChunk): integer;beginResult := sendmessage(handle, WM_CAP_FILE_SET_INFOCHUNK, 0,integer(lpInfoChunk));end;function capFileSaveDIB(Handle: HWND; szName: PChar): integer;beginResult := sendmessage(handle, WM_CAP_FILE_SAVEDIB, 0,integer(szName));end;function capEditCopy(Handle: HWND): integer;beginResult := sendmessage(handle, WM_CAP_EDIT_COPY, 0, 0);end;function capSetAudioFormat(Handle: HWND; s: PWaveFormatEx; wSize: integer): integer;beginResult := sendmessage(handle, WM_CAP_SET_AUDIOFORMAT, (wSize), integer(s));end;function capGetAudioFormat(Handle: HWND; s: PWaveFormatEx; wSize: integer): DWord;beginResult := sendmessage(handle, WM_CAP_GET_AUDIOFORMAT, (wSize),integer(s));end;function capGetAudioFormatSize(Handle: HWND): DWord;beginResult := sendmessage(handle, WM_CAP_GET_AUDIOFORMAT, 0, 0{ NULL}); end;function capDlgVideoFormat(Handle: HWND): integer;beginResult := sendmessage(handle, WM_CAP_DLG_VIDEOFORMAT, 0, 0);end;function capDlgVideoSource(Handle: HWND): integer;beginResult := sendmessage(handle, WM_CAP_DLG_VIDEOSOURCE, 0, 0);end;function capDlgVideoDisplay(Handle: HWND): integer;beginResult := sendmessage(handle, WM_CAP_DLG_VIDEODISPLAY, 0, 0);end;function capDlgVideoCompression(Handle: HWND): integer;beginResult := sendmessage(handle, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0); end;function capGetVideoFormat(Handle: HWND; s: integer; wSize: integer): DWord;beginResult := sendmessage(handle, WM_CAP_GET_VIDEOFORMAT, (wSize), (s)); end;function capGetVideoFormatSize(Handle: HWND): DWord;beginResult := DWORD(sendmessage(handle, WM_CAP_GET_VIDEOFORMAT, 0, 0));end;function capSetVideoFormat(Handle: HWND; s: integer; wSize: integer): integer;beginResult := sendmessage(handle, WM_CAP_SET_VIDEOFORMAT, (wSize), (s)); end;function capPreview(Handle: HWND; f: longbool): integer;beginResult := sendmessage(handle, WM_CAP_SET_PREVIEW, integer(f), 0); end;function capPreviewRate(Handle: HWND; wMS: integer): integer;beginResult := sendmessage(handle, WM_CAP_SET_PREVIEWRATE, (wMS), 0); end;function capOverlay(Handle: HWND; f: longbool): integer;beginResult := sendmessage(handle, WM_CAP_SET_OVERLAY, integer(f), 0); end;function capPreviewScale(Handle: HWND; f: longbool): integer;beginResult := sendmessage(handle, WM_CAP_SET_SCALE, integer(f), 0); end;function capGetStatus(Handle: HWND; s: LPCapStatus; wSize: integer): integer;beginResult := sendmessage(handle, WM_CAP_GET_STATUS, wSize, integer(s)); end;function capSetScrollPos(Handle: HWND; lpP: LPPOINT): integer;beginResult := sendmessage(handle, WM_CAP_SET_SCROLL, 0, integer(lpP)); end;function capGrabFrame(Handle: HWND): integer;beginResult := sendmessage(handle, WM_CAP_GRAB_FRAME, 0, 0);end;function capGrabFrameNoStop(Handle: HWND): integer;beginResult := sendmessage(handle, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0); end;function capCaptureSequence(Handle: HWND): integer;beginResult := sendmessage(handle, WM_CAP_SEQUENCE, 0, 0);end;function capCaptureSequenceNoFile(Handle: HWND): integer;beginResult := sendmessage(handle, WM_CAP_SEQUENCE_NOFILE, 0, 0); end;function capCaptureStop(Handle: HWND): integer;beginResult := sendmessage(handle, WM_CAP_STOP, 0, 0);end;。