0
Posted on 上午1:28:00 by Fan Zhang and filed under

  在用 DirectShow 写程序的时候,被 Renderer Filter 的问题折腾了好几次,有的问题一开始不了解还觉得莫名其妙,虽然说到现在也不是完全明白,但好歹解决了。

  我曾经遇到的问题有:

  1. 将一个解码器封装成 ActiveX 控件,但是遇到刷新问题,就是拖动窗口的时候才刷新。奇怪的是,在有的机器上就没有问题,即使配置一样,而且和 IE 版本也没什么关系。
  2. 在一个桌面播放器中同时播放4个视频,都附着到一个窗口上,但是左上角一路异常,总是打开比其他几个慢,而且拖动窗口时会反应迟缓,总之就是它特殊,但是程序中完全是一样对待的。
  3. 使用远程桌面连接的时候,看不到播放的视频。这个是小事。

  以上问题通过搜索,主要解决方法有:

  1. 折腾 OnDraw(), OnPaint(), OnEraseBkGnd() 这几个函数,要 put_owner 在窗体上,由窗体的 WM_PAINT 来刷新。
  2. 修改控件属性,添加处理消息。
  3. 不使用默认的 Renderer Filter,手动使用 VMR-9。

  也是我水平不高,还就替换 Renderer Filter 好用,手动刷新的方法在上面第二个问题的时候就不怎么好使。而且 DirectShow 提供了多个 Renderer Filter,换一个更高级的往往能解决问题。

  但是,我只是知道,比如 VMR-9 中自己管理了刷新机制,所以上述这些问题都能解决,但是如何处理的还不明白。

  DirectShow 中自带的 Renderer Filter 挺多的,甚至还有同名但是 CLSID 不同的,在 MSDN: Choosing the Right Video Renderer 中有一个较详细的介绍。通过以下 CLSID 以及 MSDN 上的资料应该能回答有关 Renderer Filter 的疑惑。

  • CLSID_OverlayMixer // {CD8743A1-3736-11d0-9E69-00C04FD7C15B}
  • CLSID_VideoRenderer // {70E102B0-5556-11CE-97C0-00AA0055595A}
  • CLSID_VideoRendererDefault // {6BC1CFFA-8FC1-4261-AC22-CFB4CC38DB50}
  • CLSID_VideoMixingRenderer // {B87BEB7B-8D29-423f-AE4D-6582C10175AC}
  • CLSID_VideoMixingRenderer9 // {51b4abf3-748f-4e3b-a276-c828330e926a}
  • CLSID_EnhancedVideoRenderer // {FA10746C-9B63-4b6c-BC49-FC300EA5F256}

  以上 CLSID 都可以在 Windows SDK 中的 uuids.h 找到。

   Overlay Mixer 不怎么用,Enhanced Video Renderer (EVR) 是 Vista 之后的,还没用过。VMR-9 最强大,如果能用(系统软硬件支持),一般能解决问题。VMR-7 以及更早的,我也分不太清楚细致的区别,其中 VMR-7 本身就有两个Filter,其中一个还和 Video Renderer Filter 的 friendly name 相同,都是 "Video Renderer"。

  因为 Renderer 接收的是 RGB/YUV 数据,然后交由显卡处理显示,所以显卡的差别会导致性能的差别。此外,VMR-9 因为有更强的功能和更好的质量,所以会占用更多的资源,在不同的显卡上,可能会有实例 (instance) 的限制,比如只能显示 7-8 个窗口,而 VMR-7 则限制小很多。

  在陆其明的书上有一些介绍,网上很多文章都是这本书上相应章节内容,搜一下"关于VMR7、VMR9、Video Renderer"就能找到。

  一句话总结,系统资源允许的情况下,使用高级的 Renderer Filter,否则就只能使用较低版本的 Renderer Filter,手动解决出现的种种问题。

0
评论 : DirectShow 中的 Renderer Filters

发表评论