0

我只有简单的图表:

SourceFilter ---> CustomTransformFilter --> VideoRendererFilter

在我的CustomTranformFilter 中,我动态更改视频属性:即我将视频重新缩放为新维度。

Input Video[1024,720]-->|CustomTransformFilter|--->Output Video[640,480] 

但是我的渲染器看到视频仍然是原始大小([1024,720] 没有重新缩放 [640,480])而且我在视频渲染器上得到损坏的图像:因为渲染器尝试根据旧尺寸绘制新图像......

我该如何解决?

最良好的祝愿

更新:

正如我从戴维斯的回答中了解到的那样:

Given: The graph is active, but the filters in question do not support dynamic 
pin reconnections

Possible mechanisms for changing the format: (MSDN DirectShow Doc)
a. QueryAccept (Downstream)
b. QueryAccept (Upstream) 
c. ReceiveConnection 

Davies 建议使用 ReceiveConnection。 ReceiveConnection:当输出引脚向其下游对等方提出格式更改时使用,并且新格式需要更大的缓冲区。(MSDN DirectShow 文档)。

gmfbridge 示例“太复杂”,我无法弄清楚如何使用“ReceiveConnection”。 我是 DirectShow 的新手。

任何人都有使用 ReceiveConnection 机制来响应动态格式变化的简单代码示例?

4

1 回答 1

4

在 DirectShow 中进行动态类型更改的常规方法是将媒体类型附加到您提供的示例中。这不适用于视频渲染器,因为它正在分配样本。在从分配器获取样本之前,您需要请求更改类型。

您可以使用 ReceiveConnection 执行此操作。您必须确保该分配器上没有未完成的缓冲区,然后您可以调用 IPin::ReceiveConnection(无需先断开连接)。在 www.gdcl.co.uk/gmfbridge 的 gmfbridge 代码中有一个这样的例子,在 BridgeSourceOutput::SwitchTo() 中。

G

于 2011-05-25T14:25:03.107 回答