2024年5月1日发(作者:)

AMCAP程序详解

文章原始出处 CSDN 作者 capboy

DirectShow提供了用应用程序从适当的硬件中捕捉和预览音/视频的能力。数据源包括:

VCR,Camera,TV Tuner,Microphone,或其他的数据源。一个应用程序可以立刻显示捕捉的

数据(预览),或是保存到一个文件中。

在这个例子中,ICaptureGraphBuilder 接口是处理捕捉工作的主要接口。你可以在你

自己的捕捉程序中使用同样的方法和接口。在这里主要讨论ICaptureGraphBuilder如何执行

音/视频的捕捉。我们假设你已经熟悉了DirectShow的filtergraph的体系和一般的

capturefilter graph的结构(可以参考DirectShow基础指南)。

ICaptureGraphBuilder接口提供了一个filter graph builder对象,让你的应用程序在

建立capture filter graph时,省去处理很多单调乏味的工作,集中精力于捕捉中。它提供的

方法满足了基本的捕捉和预览功能的要求。

FindInterface方法,在filter graph中查找一个与捕捉有关的详细的接口。使得你可以

访问一个详细接口的功能,而不需要你去列举filter graph中的pins和filters。

RenderStream方法,连接源过滤器和渲染过滤器,选择添加一些中间的过滤器。

ControlStream方法,独立地精确地控制graph的开始和结束帧。

既然是硬件捕捉,当然要和硬件打交道,接着介绍设备列举和捕捉接口。

通过ICreateDevEnum::CreateClassEnumerator方法列举捕捉系统中的设备。之后,

实例化一个DirectShow的filter去使用这个设备。

用ICaptureGraphBuilder::FindInterface去获得与捕捉相关的接口指针

IAMDroppedFrames, IAMVideoCompression, IAMStreamConfig,以及

IAMVfwCaptureDialogs 。因为设备列举和捕捉接口比较长,放在这会打乱结构,所有专门写

了一篇(参考设备列举和捕捉接口)。

NOTE:

这个示例是DirectShow自带的例子。你可以在DirectShow SDK的目录SampleDSCaputre

看这个例子代码()。这里只是他的一些片断代码。可以说是他的中文模块的说明。AMCap

例子中,把所有的接口指针和一些成员变量保存在一个全局结构gcap中了。

当不在需要保存在gcap中的接口指针是,一定要释放这些接口指针,一般是在程序的析

构函数中,或是在别的同等功能函数中。如下:

if (er)

er->Release();

er = NULL;

if ()

->Release();

= NULL;

if (gAviMux)

gAviMux->Release();

gAviMux = NULL;

if (r)

r->Release();

r = NULL;

if ()

->Release();

= NULL;

if ()

->Release();

= NULL;

if ()

->Release();

= NULL;

设置文件名

使用普通的OpenFile Dialog获得捕捉文件的信息。通过调用AllocCaptureFile函数为

捕捉文件分配空间。这一点是重要的,因为这是个巨大的空间。这样可以提高捕捉操作的速度。

ICaptureGraphBuilder::AllocCapFile执行实际的文件分配,

IFileSinkFilter::SetFileName 指示file writer filter使用用户选择的文件名保存数据。

ICaptureGraphBuilder::SetOutputFileName把file writer filter加入filter graph(后面

会介绍,它是ICaptureGraphBuilderd自代的)。

SetCaptureFile 和 AllocCaptureFile 函数如下: