`

摄像头拍照程序--视频对话

阅读更多

 

 

转自:http://www.delphibbs.com/keylife/iblog_show.asp?xid=15554

 

在许多关于视频的软件(如视频会议、可视电话等)开发中,都应用了视频捕获技术。微软为软件开发人员提供了一个专门用于视频捕获的VFW (Video for Windows) SDK。VFW SDK为在Windows系统中实现视频捕获提供了标准的接口,从而大大降低了程序的开发难度。由于VFW SDK只有VC和VB版,没有Delphi版,因此需要在Delphi中一一声明DLL中的各个函数和变量(可以参考MSDN中的VC的函数声明以及变量定义)。本文分3部分介绍如何利用VFW在Delphi中开发视频捕获程序。
VFW简介
VFW是微软公司1992年推出的关于数字视频的一个软件包,它能使应用程序通过数字化设备从传统的模拟视频源得到数字化的视频剪辑。VFW的一个关键思想是播放时不需要专用硬件,为了解决数字视频数据量大的问题,需要对数据进行压缩。它引进了一种叫AVI的文件标准,该标准未规定如何对视频进行捕获、压缩及播放,仅规定视频和音频该如何存储在硬盘上,以及在AVI文件中交替存储视频帧和与之相匹配的音频数据。VFW使程序员能通过发送消息或设置属性来捕获、播放和编辑视频剪辑。在Windows 9x系统中,当用户在安装VFW时,安装程序会自动地安装配置视频所需要的组件,如设备驱动程序、视频压缩程序等。
VFW主要由以下6个模块组成:
●AVICAP.DLL:包含执行视频捕获的函数,它给AVI文件的I/O处理和视频、音频设备驱动程序提供一个高级接口;
●MSVIDEO.DLL:包含一套特殊的DrawDib函数,用来处理屏幕上的视频操作;
●MCIAVI.DRV:包括对VFW的MCI命令解释器的驱动程序;
●AVIFILE.DLL:包含由标准多媒体I/O(mmio)函数提供的更高的命令,用来访问.AVI文件;
●压缩管理器(ICM):用于管理的视频压缩/解压缩的编译码器(Codec);
●音频压缩管理器ACM:提供与ICM相似的服务,适用于波形音频。
开发步骤
AVICap窗口类支持实时的视频流捕获和单帧捕获,并提供对视频源的控制。虽然MCI也提供数字视频服务(比如它为显示.AVI文件的视频提供了AVI VIDEO命令集),为视频叠加提供了Overlay命令集,但这些命令主要是基于文件的操作,它们不能满足实时地从视频缓存中取数据的要求, 对于使用没有视频叠加能力的捕获卡的PC机来说, 用MCI提供的命令集是无法捕获视频流的。而AVICap窗口类在捕获视频方面具有一定的优势,它能直接访问视频缓冲区,不需要生成中间文件,实时性很强,效率很高。而且,它还可将数字视频捕获到一个文件中。
1.创建“捕获窗”
在进行视频捕获之前必需要先创建一个“捕获窗”,并以它为基础进行所有的捕获及设置操作。“捕获窗”用AVICap窗口类的“CapCreateCaptureWindow”函数来创建,其窗口风格一般为WS_CHILD和WS_VISIBLE。
捕获窗类似于标准控件(如按钮、列表框等),并具有下列功能:
●将视频流和音频流捕获到一个AVI文件中;
●动态地同视频和音频输入器件连接或断开;
●以Overlay或Preview模式对输入的视频流进行实时显示;
●在捕获时,可指定所用的文件名并能将捕获文件的内容拷贝到另一个文件;
●设置捕获速率;
●显示控制视频源、视频格式、视频压缩的对话框;
●创建、保存或载入调色板;
●将图像和相关的调色板拷贝到剪贴板;
●将捕获的单帧图像保存为DIB格式的文件。
2.关联捕获窗和驱动程序
单独定义的一个捕获窗是不能工作的,它必需与一个设备相关联,这样才能取得视频信号。用函数CapDriverConnect可使一个捕获窗与一个设备驱动程序相关联。
3.设置视频设备的属性
通过设置TcaptureParms结构变量的各个成员变量,可以控制设备的采样频率、中断采样按键、状态行为等等。设置好TCaptureParms结构变量后,可以用函数CapCaptureSetSetup使设置生效。之后还可以用CapPreviewScale、CapPreviewRate来设置预览的比例与速度,也可以直接使用设备的默认值。
4.打开预览
利用函数CapOverlay选择是否采用叠加模式预览,这样占用系统资源小,并且视频显示速度快。然后用CapPreview启动预览功能,这时就可以在屏幕上看到来自摄像机的图像了。
通过以上4步就可以建立一个基本的视频捕获程序。但如果想自已处理从设备捕获到的视频数据,则要使用捕获窗回调函数来处理,比如一帧一帧地获得视频数据或以流的方式获得视频数据等等。
实例编程
下面以一个一帧一帧地从视频设备上捕获视频数据的Delphi程序为例,来说明每个函数的作用以及开发过程。
该程序的功能是可以在屏幕上显视捕获到的视频,并可以获得每一帧的图像数据。
新建一个工程,并将AVICAP32.PAS包含到USES中。
在Form1上放置一个TPanel控件,设Name为“gCapVideoArea”,该控件用于显示视频。再放置两个TButton控件,一个Name为“Openvideo”,另一个Name为“Closevideo”。
定义全局变量:
var
//定义捕获窗句柄
ghCapWnd: THandle;
//可以得到视频数据指针的结构变量,用于回调函数中
VideoStr: LPVIDEOHDR;
//用于设置设备属性的结构变量
CapParms: TCaptureParms;
在Name为“Openvideo”的TButton 的Click事件中写入以下代码:
procedure TForm1.OpenvideoClick(Sender: TObject);
begin
//使用Tpanel控件来创建捕获窗口
ghCapWnd := CapCreateCaptureWindow
( PChar(‘KruwoSoft'), //捕获窗口的名字
WS_CHILD or WS_VISIBLE,//窗口样式
0, //X坐标
0, //Y坐标
gCapVideoArea.Width, //窗口宽
gCapVideoArea.Height, //窗口高
gCapVideoArea.Handle, //窗口句柄
0); //一般为0
{为了能够捕获视频帧,要启动一个捕获帧回调函数VideoStreamCallBack。捕获一个视频流或当前设备状态时分别使用以下函数:
//捕获一个视频流
CapSetCallbackOnVideoStream;
//得到一个设备错误
CapSetCallbackonError;
//得到一个设备状态
CapSetCallbackOnStatus
}
//定义一个帧捕获回调函数
CapSetCallbackOnFrame (ghCapWnd,LongInt(@VideoStreamCallBack));
//将一个捕获窗口与一个设备驱程相关联,第二个参数是个序号,当系统中装有多个显视驱动程序时,其值分别依次为0到总个数
CapDriverConnect(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 := FALSE;
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);
//将捕获窗同驱动器断开
capDriverDisconnect(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;
灵活地使用AVICap窗口类的回调函数可以满足各种不同的需求,但要注意从视频卡中捕获的视频数据的格式和图像的长宽要参考视频卡的参数。而且有些视频卡通过设置可支持多种的格式和图像长宽,所以在还原图像时要注意参考所用的视频卡的参数。

分享到:
评论

相关推荐

    基于c++的摄像头测试程序 实例

    这个程序能够实现基础的摄像头功能,包括拍照和录制视频。 【描述】: 在描述中提到,这个程序是专为C++程序员设计的,它利用了C++的特性来处理摄像头硬件接口,从而实现图像捕获和视频录制。在Windows CE环境下,...

    MFC 控制摄像头摄像、拍照

    在本文中,我们将深入探讨如何在VC++环境中,利用MFC(Microsoft Foundation Classes)库来控制摄像头,实现摄像和拍照功能。MFC是微软提供的一套面向对象的C++类库,它为Windows应用程序开发提供了丰富的接口和支持...

    shexiang.rar_2440_shexiang_摄像头 拍照

    这表明我们要讨论的是基于2440微处理器的开发板上,用于摄像头拍照功能的源代码。 2440开发板是一种基于S3C2440处理器的硬件平台,常用于嵌入式系统的开发和实验。S3C2440是一款由Samsung公司设计的ARM920T内核的微...

    MFC VFM视频摄像头

    这包括打开摄像头、显示视频预览、拍照以及保存图片等功能。VFM API可以用来初始化设备,设置捕获参数,控制视频流,而MFC则负责构建和管理这些操作的用户界面。 4. **视频预览**:在MFC应用中,可以创建一个窗口类...

    海康摄像头上位机开发Demo

    通过这个Demo,开发者可以学习到如何利用海康提供的SDK(Software Development Kit)来创建与摄像头通信的程序,包括设备连接、视频流获取、智能分析配置、文件回放和日志管理等核心功能。这对于任何想要开发与海康...

    opencv打开摄像头

    在处理完每一帧后,记得使用`cv::waitKey`函数控制视频的播放速度,例如`cv::waitKey(1)`会让程序每秒处理30帧(因为默认的延迟是1毫秒)。如果希望暂停或关闭视频流,可以调用`cap.release()`。 总结一下,本例中...

    基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码

    WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音对话或视频对话的API,它允许网页直接访问用户的摄像头和麦克风,而无需借助第三方插件。 描述里提及,WebRTC可能是明年最受关注的HTML5...

    MFC摄像头添加多次保存抓拍

    在本文中,我们将深入探讨如何在Visual Studio 2010中使用Microsoft Foundation Class (MFC) 库和OpenCV库来实现一个功能,即在已有的MFC工程中添加摄像头的多次抓拍并保存视频的功能。MFC是微软提供的一套C++类库,...

    iPad-mini使用说明书.doc

    - **拍照录像**:使用前后摄像头拍摄照片和录制视频。 - **编辑处理**:对拍摄的照片和视频进行简单的编辑操作。 #### 十、照片 - **观看照片**:浏览相册中的图片。 - **整理照片**:创建相册、标记重要照片。 - *...

    ipad ipad-mini中文使用说明书

    - **拍照与录像**:利用后置摄像头捕捉美好瞬间。 - **查看、共享和打印照片**:管理存储的照片。 #### 第10章:照片 - **观看照片和视频**:浏览保存的照片和视频文件。 - **整理照片和视频**:按照时间顺序或...

    Scratch课程-scratch大纲

    - **拍照创建角色**:使用摄像头拍摄照片作为角色的技巧。 **知识点3:创建背景** - **选择背景**:从Scratch背景库中挑选适合的背景。 - **绘制背景**:使用Scratch画板功能绘制自定义背景。 - **导入背景**:将...

    MFCcamera.

    在这个"MFCcamera"项目中,开发者利用MFC框架创建了一个简单的相机应用,功能包括拍照、录制视频,以及一个锁屏界面。接下来,我们将深入探讨MFC、相机编程以及C++在Windows应用开发中的使用。 1. **MFC基础**: -...

    BlackBerry9500中文教程

    - **录制视频**:使用摄像头录制视频。 - **相机和摄像机选项**:自定义相机设置。 - **相机快捷方式**:快速访问相机功能。 - **相机和摄像机疑难解答**:解决相机使用中的常见问题。 #### 多媒体功能 - **传输和...

    vfw开发总结推荐.pdf

    接着,作者创建了一个名为`Video`的自定义类,该类基于`AviCapture`类并扩展了对摄像头的控制功能,包括打开和关闭摄像头、开始和结束录像、拍照等。在`Video`类中,核心的函数是`capCreateCaptureWindow`,它用于...

    Blackberry黑莓 BOLD 9000用户指南

    - **相机和摄像机疑难解答**:解决摄像头相关问题的步骤。 #### 六、媒体 涵盖了多媒体文件的管理和使用。 - **传输和下载多媒体文件**:如何在设备之间传输文件。 - **播放多媒体文件和录制语音消息**:使用内置...

Global site tag (gtag.js) - Google Analytics