Capture Graph Builder

Capture Graph Builder可以用来构建大多数的filter图表,并不仅仅是捕捉graph。本文简单介绍了如何利用Capture Graph Builder来构建graph。

Capture Graph Builder暴露了ICaptureGraphBuilder2接口指针,首先创建一个capture builder,和一个filter图表管理器对象,然后用图表管理器对象指针初始化Capture Graph Builder。代码如下:

IGraphBuilder *pGraph = NULL;
ICaptureGraphBuilder2 *pBuilder = NULL;
// Create the Filter Graph Manager.
HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);
if (SUCCEEDED(hr))
{
// Create the Capture Graph Builder.
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, 
(void **)&pBuilder);
if (SUCCEEDED(hr))
{
pBuilder->SetFiltergraph (pGraph);
}
};

连接filter

ICaptureGraphBuilder2::RenderStream方法可以同时将两个或者三个filter连接成一个链(chain)。通常情况下,当每个filter只有一个输出pin和一个输入pin时,这个方法就才适用。

我们现在先忽略前两个参数,第三个参数是一个IUnknown指针,指向一个filter或者输出pin。第五,六个参数指向IBaseFilter指针。RenderStream就将三个filter连接成一个链。例如,假设A,B,C 是三个filter,每个filter只有一个输出pin和一个输入pin。

下面的代码可以将B连接到A上,将B连接到C上。

RenderStream(NULL, NULL, A, B, C)

所有的连接都是智能化的,如果是将两个filter相连,你可以将中间的参数设置为NULL:

RenderStream(NULL, NULL, A, NULL, C)

也可以调用两次这个函数创建一个更长的链条。

RenderStream(NULL, NULL, A, B, C)
RenderStream(NULL, NULL, C, D, E)

如果最后的一个参数设置为NULL, 这个方法就自动的为graph设置一个renderer filter。如果是视频就设置成Video Renderer,如果是音频就设置为DirectSoundRenderer。因此RenderStream(NULL, NULL, A, NULL, NULL)等价于 RenderStream(NULL, NULL, A, NULL, R) 
这里R指的是Render Filter。

如果你在第三个参数指定的是filter,而不是pin,你就要在第一二个参数里指定使用那个输出pin用于连接。

第一个参数只适用于捕捉filter,它指定pin的所属种类的GUID,具体的设置可以参考Pin Property Set.,但是下面的两个种类对于所有的filter都有效。

PIN_CATEGORY_CAPTURE 
PIN_CATEGORY_PREVIEW

如果捕捉filter不支持捕捉和预览,RenderStream方法就增加一个Smart Tee来分割数据流。

如果播放文件,要将捕捉filter和一个mux filter连接起来,第二个参数指明了媒体类型:

MEDIATYPE_Audio 
MEDIATYPE_Video 
MEDIATYPE_Interleaved (DV)

查询filter和pin的接口指针

当你建立一个graph后,也许你需要查询graph中的filter和pin暴露的接口指针。例如,一个捕捉filter也许暴露了IAMDroppedFrames接口,它的输出pin也许暴露了IAMStreamConfig接口。

查询接口最简单地方法就是使用ICaptureGraphBuilder2::FindInterface方法。这个方法遍历整个graph的filter和pin,直到他找到合适的filter。你可以指定开始的filter,然后指定搜索的方向,(向上搜索还是向下搜索)。

下面的代码在一个视频预览pin上搜索IAMStreamConfig接口

IAMStreamConfig *pConfig = NULL;
HRESULT hr = pBuild->FindInterface(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,pVCap,IID_IAMStreamConfig, 
(void**)&pConfig
);
if (SUCCESSFUL(hr))
{
/* ... */
pConfig->Release();
}

查找pin

如果你需要在某个filter上查询某个接口,可以用ICaptureGraphBuilder2::FindPin方法,代码如下:

IPin *pPin = NULL;
hr = pBuild->FindPin(
pCap, // Pointer to the filter to search.
PINDIR_OUTPUT, // Search for an output pin.
&PIN_CATEGORY_PREVIEW, // Search for a preview pin.
&MEDIATYPE_Video, // Search for a video pin.
TRUE, // The pin must be unconnected. 
0, // Return the first matching pin (index 0).
&pPin); // This variable receives the IPin pointer.
if (SUCCESSFUL(hr))
{
/* ... */
pPin->Release();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值