DirectShow中使用GMFBridge

时间:2011-05-23 09:41:39

标签: directshow directshow.net

enter code here我必须动态停止并启动视频渲染器过滤器。在没有创建新图表的情况下,使用“普通”Direct Show Architecture是不可能的。但是使用GMFBridge似乎是可能的。

但我无法弄清楚如何使用它。(是的,我在http://www.gdcl.co.uk/gmfbridge/index.htm阅读了论文)

我的图表是:

SourceFilter ---> MyCustomTransformFilter ---> Video Rendrer Filter

所以GMFBridge适合哪里?

i) I can devide my graph two pieces 
       [ Source Filter + MyCustomFilter ] + Video Rendere


ii) Then how to add my filters to graph, and stop start Video Rendrere without 
affecting the rest of my grapg using GMFBridge?

更新:

谢谢Wimmel

我只是感到困惑......让我明白我的理解

i)我最初有单个图表

 (SingleGraph) SourceFilter ---> MyCustomTransformFilter ---> Video Rendrer Filter

ii)为了使用GMFBridge,我将单个图表转换为两个单独的图表

 First Graph  :  SourceFilter ---> MyCustomTransformFilter --> GMFBridgeSinkFilter
 Second Graph :  GMFBridgeSourceFilter ---> Video Renderer Filter

那么,GMFBridgeSinkFilter和GMFBridgeSourceFilter?这些是什么?他们的班级类型?

iii)然后我创建一个IGMFBridgeControllerPtr的内容并进行必要的初始化...

IGMFBridgeControllerPtr bridgeController = ......

.....
bridgeController->AddStream(true, eUncompressed, true); 
bridgeController->AddStream(false, eUncompressed, true); 

iv)桥接控制器为源图表添加接收器过滤器并连接它:

 bridgeController->InsertSinkFilter(sourceGraph, sourceGraphSinkFilter);

什么是sourceGraph,sourceGraphSinkFilter s?

// now connect it like this:
// SourceFilter ---> MyCustomTransformFilter ---> SourceGraphSinkFilter

您的意思是在源图表中以编程方式连接这些过滤器?

iv)在第二个图中,让控制器添加一个源过滤器,并将其连接到渲染器:

bridgeController->InsertSourceFilter(sinkFilter, renderGraph, renderGraphSourceFilter);

什么是sinkFilter,renderGraphSourceFilter等?

 // now connect it like this:
 // RenderGraphSourceFilter ---> Video Renderer Filter

并且您的意思是在源图表中以编程方式连接这些过滤器?

1 个答案:

答案 0 :(得分:3)

您可能想要创建以下两个图表:

1: SourceFilter ---> MyCustomTransformFilter ---> GMFBridgeSinkFilter

2: GMFBridgeSourceFilter ---> Video Renderer Filter

基本上,您可以执行以下操作:

创建GMFBridgeController并对其进行配置,例如一个视频和一个音频流:

IGMFBridgeControllerPtr  m_pController; 
HRESULT hr = m_pController.CreateInstance(__uuidof(GMFBridgeController)); 
m_pController->AddStream(true, eUncompressed, true); 
m_pController->AddStream(false, eUncompressed, true); 

现在让控制器为源图添加一个接收器过滤器并连接它:

hr = m_pController->InsertSinkFilter(m_pSourceGraph, &m_pSourceGraphSinkFilter);
// now connect it like this:
// SourceFilter ---> MyCustomTransformFilter ---> SourceGraphSinkFilter

在第二个图表中,让控制器添加一个源过滤器,并将其连接到渲染器:

hr = m_pController->InsertSourceFilter(m_pSourceGraphSinkFilter, m_pRenderGraph, &m_pRenderGraphSourceFilter); 
// now connect it like this:
// RenderGraphSourceFilter ---> Video Renderer Filter

启动两个图并连接它们:

hr = m_pController->BridgeGraphs(m_pSourceGraphSinkFilter, m_pRenderGraphSourceFilter); 

如果您想停止一张图表,请先断开连接:

m_pController->BridgeGraphs(NULL, NULL);

修改

以下是您要求的一些说明:

GMFBridgeSinkFilter和GMFBridgeSourceFilter是GMFBridge创建的过滤器。我不知道它们的确切类型,但至少它们来自IBaseFilter。

m_pSourceGraph和m_pRenderGraph是您创建的两个图形的IGraphBuilder接口。

m_pSourceGraphSinkFilter和m_pRenderGraphSourceFilter是指向IBaseFilter的指针,用于接收指向GMFBridge创建的过滤器的指针。

是的,当我说连接过滤器时,我的意思是以编程方式连接它们。据我所知,你不能用graphedit测试GMFBridge。