Directshow中的视频捕捉[1]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 aoosang 的 blog


本篇文档主要描述关于用directshow进行视频开发的一些技术
主要包括下面内容



1关于视频捕捉(about video capture in dshow)

1视频捕捉graph的构建
一个能够捕捉音频或者视频的graph图都称之为捕捉graph图。捕捉graph图比一般的文件回放graph图要复杂许多,dshow提供了一个capture graph builder com组件使得捕捉graph图的生成更加简单。capture graph builder提供了一个icapturegraphbuilder2接口,这个接口提供了一些方法用来构建和控制捕捉graph。
首先创建一个capture graph builder对象和一个graph manger对象,然后用filter graph manager 作参数,调用icapturegraphbuilder2::setfiltergraph来初始化capture graph builder。看下面的代码把
hresult initcapturegraphbuilder(
igraphbuilder **ppgraph, // receives the pointer.
icapturegraphbuilder2 **ppbuild // receives the pointer.
)
{
if (!ppgraph || !ppbuild)
{
return e_pointer;
}
igraphbuilder *pgraph = null;
icapturegraphbuilder2 *pbuild = null;

// create the capture graph builder.
hresult hr = cocreateinstance(clsid_capturegraphbuilder2, null,
clsctx_inproc_server, iid_icapturegraphbuilder2, (void**)&pgraph);
if (succeeded(hr))
{
// create the filter graph manager.
hr = cocreateinstance(clsid_filtergraph, 0, clsctx_inproc_server,
iid_igraphbuilder, (void**)&pgraph);
if (succeeded(hr))
{
// initialize the capture graph builder.
pbuild->setfiltergraph(pgraph);

// return both interface pointers to the caller.
*ppbuild = pbuild;
*ppgraph = pgraph; // the caller must release both interfaces.
return s_ok;
}
else
{
pbuild->release();
}
}
return hr; // failed
}

2视频捕捉的设备
现在许多新的视频捕捉设备都采用的是wdm驱动方法,在wdm机制中,微软提供了一个独立于硬件设备的驱动,称为类驱动程序。驱动程序的供应商提供的驱动程序称为minidrivers。minidrivers提供了直接和硬件打交道的函数,在这些函数中调用了类驱动。
在directshow的filter图表中,任何一个wdm捕捉设备都是做为一个wdm video capture
过滤器(filter)出现。wdm video capture过滤器根据驱动程序的特征构建自己的filter

下面是陆其明的一篇有关于dshow和硬件的文章,可以拿来参考一下

//陆文章开始

大家知道,为了提高系统的稳定性,windows操作系统对硬件操作进行了隔离;应用程序一般不能直接访问硬件。directshow filter工作在用户模式(user mode,操作系统特权级别为ring 3),而硬件工作在内核模式(kernel mode,操作系统特权级别为ring 0),那么它们之间怎么协同工作呢?

directshow解决的方法是,为这些硬件设计包装filter;这种filter能够工作在用户模式下,外观、控制方法跟普通filter一样,而包装filter内部完成与硬件驱动程序的交互。这样的设计,使得编写directshow应用程序的开发人员,从为支持硬件而需做出的特殊处理中解脱出来。directshow已经集成的包装filter,包括audio capture filter(qcap.dll)、vfw capture filter(qcap.dll,filter的class id为clsid_vfwcapture)、tv tuner filter(kstvtune.ax,filter的class id为clsid_ctvtunerfilter)、analog video crossbar filter(ksxbar.ax)、tv audio filter(filter的class id为clsid_tvaudiofilter)等;另外,directshow为采用wdm驱动程序的硬件设计了ksproxy filter(ksproxy.ax,)。我们来看一下结构图:

图1
从上图中,我们可以看出,ksproxy.ax、kstune.ax、ksxbar.ax这些包装filter跟其它普通的directshow filter处于同一个级别,可以协同工作;用户模式下的filter通过stream class控制硬件的驱动程序minidriver(由硬件厂商提供的实现对硬件控制功能的dll);stream class和minidriver一起向上层提供系统底层级别的服务。值得注意的是,这里的stream class是一种驱动模型,它负责调用硬件的minidriver;另外,stream class的功能还在于协调minidriver之间的工作,使得一些数据可以直接在kernel mode下从一个硬件传输到另一个硬件(或同一个硬件上的不同功能模块),提高了系统的工作效率。(更多的关于底层驱动程序的细节,请读者参阅windows ddk。)

下面,我们分别来看一下几种常见的硬件。
vfw视频采集卡。这类硬件在市场上已经处于一种淘汰的趋势;新生产的视频采集卡一般采用wdm驱动模型。但是,directshow为了保持向后兼容,还是专门提供了一个包装filter支持这种硬件。和其他硬件的包装filter一样,这种包装filter的创建不是像普通filter一样使用cocreateinstance,而要通过系统枚举,然后bindtoobject。

音频采集卡(声卡)。声卡的采集功能也是通过包装filter来实现的;而且现在的声卡大部分都有混音的功能。这个filter一般有几个input pin,每个pin都代表一个输入,如line in、microphone、cd、midi等。值得注意的是,这些pin代表的是声卡上的物理输入端子,在filter graph中是永远不会连接到其他filter上的。声卡的输出功能,可以有两个filter供选择:directsound renderer filter和audio renderer (waveout) filter。注意,这两个filter不是上述意义上的包装filter,它们能够同硬件交互,是因为它们使用了api函数:前者使用了directsound api,后者使用了waveout api。这两个filter的区别,还在于后者输出音频的同时不支持混音。(顺便说明一下,video renderer filter能够访问显卡,也是因为使用了gdi、directdraw或direct3d api。)如果你的机器上有声卡的话,你可以通过graphedit,在audio capture sources目录下看到这个声卡的包装filter。

本文关键:Directshow中的视频捕捉
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top