gpt4 book ai didi

directshow - DirectShow 中 GMFBridge 的使用

转载 作者:行者123 更新时间:2023-12-04 06:25:27 30 4
gpt4 key购买 nike

enter code here我必须动态停止和启动 Video Renderer Filter。在不创建新图表的情况下,使用“普通”直接展示架构是不可能的。但是使用 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 ?这些是什么?他们的类(class)类型?

iii) 然后我创建 IGMFBridgeControllerPtr 的实例并进行必要的初始化...
IGMFBridgeControllerPtr bridgeController = ......

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

iv) 桥 Controller 向源图添加一个接收器过滤器并连接它:
 bridgeController->InsertSinkFilter(sourceGraph, sourceGraphSinkFilter);

什么是 sourceGraph、sourceGraphSinkFilter ?
// now connect it like this:
// SourceFilter ---> MyCustomTransformFilter ---> SourceGraphSinkFilter

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

iv) 在第二个图中,让 Controller 添加一个源过滤器,并将其连接到渲染器:
bridgeController->InsertSourceFilter(sinkFilter, renderGraph, renderGraphSourceFilter);

什么是 sinkFilter、renderGraphSourceFilter 等?
 // now connect it like this:
// RenderGraphSourceFilter ---> Video Renderer Filter

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

最佳答案

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

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);

现在让 Controller 向源图添加一个接收器过滤器并连接它:
hr = m_pController->InsertSinkFilter(m_pSourceGraph, &m_pSourceGraphSinkFilter);
// now connect it like this:
// SourceFilter ---> MyCustomTransformFilter ---> SourceGraphSinkFilter

在您的第二个图中,让 Controller 添加一个源过滤器,并将其连接到渲染器:
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 接口(interface)。

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

是的,当我说连接过滤器时,我的意思是以编程方式连接它们。据我所知,您无法在 graphedit 中测试 GMFBridge。

关于directshow - DirectShow 中 GMFBridge 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6095452/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com