我只是简单的图表:
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 Doc)。
gmfbridge示例“太复杂”,让我无法弄清楚如何使用“ReceiveConnection”。 我是DirectShow的新手。
是否有任何人使用ReceiveConnection机制来响应动态格式更改的简单代码示例?
答案 0 :(得分:4)
在DirectShow中执行动态类型更改的常规方法是将媒体类型附加到您提供的示例。这不适用于视频渲染器,因为它正在分配样本。在从分配器获取样本之前,您需要请求更改类型。
您可以使用ReceiveConnection执行此操作。您必须确保该分配器上没有未完成的缓冲区,然后您可以调用IPin :: ReceiveConnection(不先断开连接)。在www.gdcl.co.uk/gmfbridge的gmfbridge代码中有一个例子,在BridgeSourceOutput :: SwitchTo()中。