标题：视频混合渲染器
VMR7与VMR9
  软件界面在使用KMP、MPC等播放器时，我们对DirectShow视频渲染器总是一头雾水，到底什么是VMR7、VMR9？
让我们先从Video Renderer和Overlay Mixer说起。Video Renderer和Overlay Mixer大家知道，Video Renderer (VR)是接收RGB/YUV裸数据，然后在显示器上显示的Filter。为提高计算机画图性能，根据你计算机显卡的能力，VR会优先使用DirectDraw以及Overlay表面；如果这些特性得不到显卡的支持，VR会使用GDI函数进行画图。在上级Filter连接到VR时，VR总是先要求当前显示器设置的色彩位数的RGB格式，如你的机器设置的是24位彩色，则VR首先要求连接的Media type为RGB24。如果你的显卡支持YUV Overlay表面，那么在Filter Graph运行起来的时候，VR会动态改变已经连接的Media type，要求上级Filter输出一种合适的YUV格式。VR Filter上实现了IVideoWindow接口，Filter Graph Manager主要通过这个接口来控制视频窗口。 
那么，Overlay Mixer又是怎么回事呢？简单地说，Overlay Mixer就是能够将几路视频流合成输出的Filter。这个Filter是特地为DVD回放（DVD有Sub-picture或line-21数据需要叠加显示）或广播视频流（含有line-21数据）而设计的。同时，它还支持硬件解码器使用Video Port Extensions，就是绕过PCI总线，将硬件解码出来的数据直接送给显卡显示。这个Filter同样优先使用显卡的DirectDraw能力，而且必须要有Overlay表面。Overlay Mixer有一个输出Pin，输出的Media type是：MEDIATYPE_VIDEO，MEDIASUBTYPE_ Overlay；后面一般连上一个Video Renderer。当Filter Graph运行时，实际的图像显示工作由Overlay Mixer完成，而Video Renderer只是做一个视频窗口的管理工作。还有另外一个更常见的Filter：Overlay Mixer 2。这个Filter跟Overlay Mixer功能上是一样的，只是两个Filter支持的Format type不同和Merit值不同而已。 
Overlay Mixer使用Color keying来实现几路视频的合成：它将Color key和sub-picture（或line-21）数据送到主表面，将主视频数据送到Overlay表面；显卡然后将两个表面的数据合成，送到帧缓存（Frame buffer）中进行显示。典型的情况，Overlay Mixer使用三个Input pin：Pin 0输入主视频数据，Pin 1和Pin 2输入sub-picture数据和line-21数据。Overlay Mixer在内部根据Pin 0输入的数据来创建Overlay表面。Overlay Mixer向上一般连接的是Video Decoder。如果这是个Software decoder，则Pin 0上的数据传输使用标准的IMemInputPin接口；如果使用了硬件加速，则Pin 0上必须使用IAMVideoAccelerator接口。（注意这两种接口是不能同时使用的！）如果上一级Filter是硬件解码器的包装Filter，使用VP pin输出，则解码器与Overlay Mixer使用IVPConfig和IVPNotify接口对通讯，以协调工作。Overlay Mixer不支持1394或USB接口的采集设备。Overlay Mixer向下一般连的是Video Renderer。这时Video Renderer只是一个视频窗口管理器。两个Filter通过IOverlay和IOverlayNotify接口对进行通讯，以协调工作。（Video Renderer的Input pin有两种连接方式：VR直接做图像显示时，则使用IMemInputPin接口接收视频流数据；Overlay Mixer做图像显示时，则VR使用IOverlay接口与上一级Filter进行通讯，Overlay Mixer与VR之间没有视频数据的传输。注意这两种接口是不会同时使用的！）VMR7（The Video Mixing Renderer 7）视频混合渲染器7大家看到了，其实Video Renderer与Overlay Mixer有一部分功能是重复的。Video Renderer是最早设计的，设计之初，很多应用情况没有考虑进去；于是，就用Overlay Mixer来“打补丁”。现在，我们为什么不把两部分功能整合一下呢？微软也正是这么做了！在Windows XP（家庭版和专业版）中，新出现了一个Filter（注册的名字也叫“Video Renderer”，但两个Filter的CLSID是不同的，Merit值也不一样），替代了原来默认的Video Renderer。这个新的Filter，称之为Video Mixing Renderer Filter 7 （VMR-7），因为它内部使用了DirectDraw 7的技术。可以这么说，VMR是Windows平台上新一代的Video Renderer。值得注意的是，这个Filter仅在Windows XP里集成，在其他任何DirectX发布包里都得不到这个Filter。VMR-7的大致功能如下：支持最多16路输入流的alpha混合；支持在合成图像显示之前得到对其访问权；支持插入第三方开发的Video Effects和Transitions组件功能等等。还有，VMR连接时不要求RGB的Media type，因为它任何情况下都不会使用GDI函数来画图。 
这个渲染器是视频覆盖技术和Direct3D技术的结合。 它只在windows XP上有效, 后来被更高级的VMR9取代了。windows media player 7-10使用这个技术。这个渲染技术默认使用视频覆盖。然而，如果它不可用了，它可以有限的使用direct3D。它的缺点时不可进行颜色控制，截屏也还是不够好。VMR9（The Video Mixing Renderer 9）视频混合渲染器9随着DirectX 9的发布，又会出现一个新的Video Renderer，称之为VMR-9。这个Filter使用了Direct3D 9的技术。VMR-9与VMR-7是两个不同的Filter。VMR-9的性能更加强劲。值得注意的是，为了保持向下兼容，VMR-9的Merit值并不高，它不作为系统默认的Video Renderer；如果你的应用程序只需要很少的视频显示控制，建议还是使用各自平台默认的Video Renderer。
这是目前最新的视频渲染技术（DX10出来之前还是）。它完全建立在Direct3D上，需要Direct9和最新的硬件。它可以提供最好的画质（取决于渲染模式和显卡）。VMR9支持硬件颜色操作（如果卡支持），但是没有gamma控制，因为Microsoft没有提供。VMR9也有宽高比控制。总结显然，结果已经很明显，如果你想获得高级的功能和更好的质量，请使用VMR-9，如果你需要更快的速度或者机器配置不够高，请选择VMR-7 。
KMP中关于选择视频渲染器有这样一段话：
“请选择如何在KMP 中输出图像。默认情况下推荐使用覆盖混合器。如果您正在使用 Windows XP或DirectX 9 请选择 VMR 7 / 9 未渲染，并使字幕输出到VMR表面。它将增加字幕的质量 ;如果您无法切换到桌面模式或在 VMR   输出中使用覆盖字幕。那么 请选择使用内建渲染器通过 DirectDraw 渲染直接输出图像。如果它可以被正确覆盖那么使用覆盖表面将会得到更柔和和更快速的图像播放效果。”
视频渲染模式介绍
01.视频覆盖：大概在1995年，当mpeg1(vcd)回放在pc上开始流行的时候，pc的处理能力还么有强大到实时播放的地步。显卡制造厂商适时的推出了"video overlay（视频覆盖）"的技术。它就是种在显卡上用硬件完成同时显示几个视频的功能(拉伸，颜色空间变换，等等...)的技术，这样就可以在pc上流畅的播放动画而不占用cpu。视频覆盖的画面质量事实上取决于显卡硬件。我发现市面上的绝大部分的显卡显示视频覆盖质量都很不行。在视频覆盖上用视频渲染技术的一个最大的关键就是在每个显卡上只有一个视频覆盖 unit(单元). 这样就迫切的需要多显示器系统了。02.Direct3D：Direct3D是微软提供给程序员使用一个不断进化的功能集合的DirectX库的一部分。在新发布的direct9 中，微软给出了一套新的功能，性能接近于覆盖 suface(接口)，但是没那么多限制。视频渲染技术基于direct3d比视频覆盖提供了更好的图像质量，还没有视频覆盖单显示器的麻烦。但是，不是所有的显卡都支持这个技术， 还有一些根本不支持，很多不支持整套功能集。作为一个一般的参考。03.系统默认渲染器：当播放器用默认回放模式播放媒体文件的时候，在低于windows xp的所有windows系统上或者windowsxp的"vmr7", 用系统默认渲染器就意味着"标准覆盖" 。04.标准覆盖渲染器：这是最老的视频渲染技术了。在可用的时候它用到视频覆盖，当视频不可用的时候就退回到纯cpu控制视频。纯cpu控制就是说cpu替代了视频覆盖来干这些事情。这对回放是个沉重的打击(cpu更辛苦了)，这个渲染的缺点是它不支持固定屏幕高宽比控制，硬件颜色控制(色调/饱和度/亮度/对比度/gamma(灰度))不可操作，而且抓图结果会很很奇怪。05.覆盖混合渲染：同样是运用视频覆盖技术，这个渲染器允许在那些支持颜色控制的硬件上进行颜色控制(色调/饱和度/亮度/对比度/gamma)。有些卡可能只支持颜色控制的一个子集(比如只有亮度)。这个渲染器也支持固定宽高比控制，只要媒体文件支持这个渲染器，缺点就是它返回到纯cpu控制。当视频覆盖不可操作时，它就罢工了。在媒体模式的这个情况时候，就会回到标准覆盖渲染。在dvd模式时，会报错说视频解码器不能连接到覆盖混合器。最后，这个渲染技术还是抓图的效果不够好。06.视频混合渲染器7(vmr7)：这个渲染器是视频覆盖技术和direct3d技术的结合，它只在windows xp上有效，后来被vmr9取代了。windows media player 7-10使用这个技术.这个渲染技术默认使用视频覆盖。然而，如果它不可用了，它可以有限的使用direct3d。它的缺点是不可进行颜色控制，截屏还是不够好。07.视频混合渲染器9(vmr9)：这是最新的视频渲染技术。它完全建筑在direct3d上，需要direct9和最新的硬件。它可以提供最好的画质(取决于渲染模式和显卡)。vmr9支持硬件颜色操作(如果卡支持)， 但是没有gamma控制，因为ms没有提供。 vmr9也有宽高比控制。08.EVR增强渲染模式（vista系统）：Vista新引入了全新的EVR渲染器，微软的技术文档倒是把这个东东吹得很强劲，但是就目前来说问题还是不少。第一个就是字幕的问题，目前用EVR是无法在高速或者急速模式下把字幕显示出来。那个EVR C/A 倒是能够显示字幕，不过dxva2.0就会失效，换句话说就无法开启geforce8显卡的硬件解码功能。还有一个问题就是色阶或者黑位问题。