草图大师2014没有导入:DirectShow入门利用Capture Graph Builder构建Graph图表
来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 12:16:08
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();
}
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();
}
DirectShow入门利用Capture Graph Builder构建Graph图表
directshow 笔记
VC中利用多线程技术实现线程之间的通信 - 开发者在线 - www.builder.com...
利用漂浮栽培构建水上花园
Common Lisp语言快速入门 - 开发者在线 - www.builder.com.cn
从入门到精通:构建SSH安全通道
股票入门知识:如何利用被套股票获利?
利用虚拟现实技术构建动画素材开发环境的研究-计算机网络-论文网
利用权、财、暴力结合的力量还重新构建黑秩序
大卫PS入门基础教程 第九课:利用快速蒙板抠图 - 蓝色大卫photoshop入门基础教程...
Capture NX 技术文章1
Capture NX实用技巧指南
摄影师Capture NX指南
Capture NX 2
flex builder 3 操作技巧
用DirectShow实现QQ的音视频聊天功能
用DirectShow实现QQ的音视频聊天功能2
《摄影师Capture NX指南》1
尼康新Capture NX使用手记
Capture NX实用技巧指南k
Capture NX2简单使用教程
【Capture NX 2 入门教程大全】
中医图表
P3图表