【问题标题】:GMFBridge usage in DirectShowDirectShow 中 GMFBridge 的使用
【发布时间】:2011-08-31 00:40:13
【问题描述】:

enter code here我必须动态地停止和启动视频渲染过滤器。在不创建新图表的情况下,使用“普通”直接展示架构是不可能的。但是使用 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?

更新:

感谢维梅尔

我只是糊涂了...让我澄清一下我的理解

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?

// 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

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

【问题讨论】:

  • 我猜你会有两个图表,并使用 GMFBridge 将数据从一个传递到另一个......

标签: directshow directshow.net


【解决方案1】:

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

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。

【讨论】:

  • 谢谢威梅尔。我只是对你使用的变量感到困惑。我在更新部分的猜测中提出了我的观点。
  • @setiGuy 我已经添加了一些说明。
  • 请澄清...再问一个问题...要将 RenderGraphSourceFilter 和 SourceGraphSinkFilter 连接到我的其他过滤器,我应该知道它们的引脚名称...它们的引脚名称是什么?或者以编程方式连接它们的任何其他智能方式? @Wimmel
  • @setiGuy,连接这些过滤器有不同的方法,我从不使用引脚名称。参见例如msdn.microsoft.com/en-us/library/dd387915(v=vs.85).aspx,但您也可以使用“渲染”。但由于这是一个不同的话题,如果还不清楚,请提出一个新问题。
  • 好的。感谢您的简短回答。祝您好运
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
相关资源
最近更新 更多