【问题标题】:Custom DirectShow Video Renderer Filter - Dynamic Resolution Change自定义 DirectShow 视频渲染器过滤器 - 动态分辨率更改
【发布时间】:2011-11-17 09:25:59
【问题描述】:

我有一个Custom DirectShow Video Renderer Filter,它在Microsoft's Video Renderer Filter 上具有一些扩展功能,例如叠加图像。我知道我可以用Transform Filter 做同样的事情,但我选择了这种方式。我也相信,Transform Filter 会遇到同样的问题,我将在下面描述。

当我使用Microsoft's Video Renderer Filter 时,它能够在流启动/更改时自动调整窗口大小和缓冲区大小。我的过滤器能够做同样的事情,但除了流开始后我无法接收事件。我相信我可以以某种方式查询,但我不知道如何查询。

当前的事件管道如下所示。

On Pin Connect
--------------
CreateInstance  
Video Renderer Class Constructor
CheckMediaType  
SetMediaType    
-> Width: 100, Height: 100  
CheckMediaType  
CheckMediaType  
CheckMediaType  
SetMediaType
-> Width: 100, Height: 100  

On Play
-------
StartStreaming
DoRenderSample
...
...
...
DoRenderSample

On Stop
-------
Video Renderer Class Destructor

我的源过滤器设置的默认窗口大小为 100x100。我可以在引脚连接上得到这个两次。但是在StartStreaming 之后,我无法再次获得CheckMediaTypeSetMediaType 事件。我可以尝试从源过滤器触发它们(这也是我的代码),但由于 Microsoft's Video Renderer 能够自动调整 StartStreaming 的大小,我希望拥有相同的功能。

问题:

  1. 流媒体开始后我应该如何触发CheckMediaType / SetMediaType 调用?实际上SetMediaType 对我来说很重要。还是有其他方法可以查询当前流分辨率?
  2. 我是否需要在DoRenderSample 中不断检查可能的视频大小变化?

【问题讨论】:

    标签: video filter directshow resolution renderer


    【解决方案1】:

    CheckMediaTypeSetMediaType 不完全是“事件”,它们不会自行出现,因此您无法触发它们。你要改变决议吗?像 VMR 那样靠自己来扩展步幅吗?还是接受上游过滤器的分辨率更改?

    此 MSDN 部分包含详细信息:Dynamic Format Changes

    【讨论】:

    • 是的,我们想要的只是改变分辨率,而不是像 YUV->RGB 等其他媒体类型的改变。我们想做的和 VMR 完全一样。顺便说一句,我们的类是从 CBaseVideoRenderer 扩展而来的,它是从使用 CRendererInputPin 作为友元类的 CBaseRenderer 扩展而来的。我应该使用自定义 Pin 来覆盖 QueryAccept 并获得这些分辨率更改吗?
    • 那么你到底想支持什么?像 VMR 那样扩展步幅,还是像 VMR 那样处理上游过滤器请求的格式更改?
    • 它们是由上游过滤器启动的,因此您应该在IPin::ReceiveConnectionIPin::QueryAcceptIPinConnection::DynamicQueryAccept(如果适用)上设置断点。然后检查执行在分辨率更改时到达的位置,并单步执行基类以查看它是否拒绝请求,然后再将其到达您在CheckMediaType 中期望的位置。
    • 其实我自己也读过这个。但是我的一个问题是我正在使用 CBaseVideoRenderer 并且它已经有一个默认 Pin。而这个 Pin (CRendererInputPin) 是其基类的友元类。我之前尝试覆盖 QueryAccept 但失败了。我应该使用像 CBaseFilter 这样的原始东西并自己创建所有内容(包括 pin),还是可以使用 CBaseVideoRenderer 编写 Pin 类的虚拟方法?我以前试过,但没有用。
    • 我设法覆盖了 IPin::ReceiveConnection 和 IPin::QueryAccept 但它们都没有被调用。我还在解决它,但还没有解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2012-03-21
    • 2020-11-14
    • 2012-11-12
    相关资源
    最近更新 更多