在此处输入代码
我必须动态停止和启动视频渲染器过滤器。如果不创建新的图形,这对于“正常”Direct Show 架构来说是不可能的。但使用 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) Bridge 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/