关于Video Renderer和Overlay Mixer

  • 原文作者: 陆其明
  • 整理日期: 2004/12/27  
  • 大家知道,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之间没有视频数据的传输。注意这两种接口是不会同时使用的!)

    大家看到了,其实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函数来画图。

    随着DirectX 9的发布,又会出现一个新的Video Renderer,称之为VMR-9。这个Filter使用了Direct3D 9的技术。VMR-9与VMR-7是两个不同的Filter。VMR-9的性能更加强劲。值得注意的是,为了保持向下兼容,VMR-9的Merit值并不高,它不作为系统默认的Video Renderer;如果你的应用程序只需要很少的视频显示控制,建议还是使用各自平台默认的Video Renderer。

    下面是关于一些Video Renderer使用的常见问题,可供参考:
    1. 写基于DirectShow的应用程序,肯定会用到Filter Graph Manager的IVideoWindow接口。Filter Graph Manager上的这个接口,实际实现于Video Renderer上。需要特别注意的是,必须在Video Renderer连接成功后才能调用这个接口的方法,否则方法调用总会失败。
    2. 通过IVideoWindow::put_FullScreenMode实现全屏模式。对于一些新的显卡,VR能够对图像直接拉伸后再显示(性能不会损失很大);但如果显卡本身性能不佳,Filter Graph Manager会自动将VR替换为Full Screen Renderer Filter。事实上,当用户调用该接口函数要求切换到全屏模式时,Filter Graph Manager的控制逻辑为:优先使用在Filter Graph中直接支持全屏模式的Video Renderer(通过IVideoWindow::get_FullScreen Mode判断);否则,使用一个对图像缩放到全屏,性能损失不是很大的Video Renderer;再则,使用Full Screen Renderer Filter替换;以上尝试都失败,则选择Filter Graph中任意一个支持IVideoWindow接口的Video Renderer。除了一些比较老的显卡,一般第二步尝试就能成功。
    3. 通过IBasicVideo::GetCurrentImage得到当前的图像数据。对于一般的Video Renderer来说,使用这个接口函数是不可靠的。因为如果Video Renderer使用了DirectDraw加速,这个函数调用会失败;而且调用这个函数,Video Renderer必须处于Pause状态。而对于VMR,则完全没有如上这些限制。所以,在使用Video Renderer的情况下,想得到整个视频流中的某一帧的图像,建议写一个In-place-trans filter,插入到Video Renderer的前面,很简单就能实现。
    4. 有时候,从一个Decoder的Output pin Render出去,会自动接上Overlay Mixer 2这个Filter?或者自己写的Decoder,怎么样让它连接到Overlay Mixer 2?这主要是Decoder的Output pin支持的Media type使用的Format type的原因。需要注意的是:Overlay Mixer 2仅支持Format_VIDEOINFO2,Overlay Mixer虽然同时支持Format_VIDEOINFO和Format_VIDEOINFO2,但它的Merit值为MERIT_DO_NOT_USE,不会被自动加入Filter Graph中。

### 回答1: Unity的LineRenderer组件可以用来在3D场景中绘制线条,而UI中的连线则可以通过调整UI元素的位置和大小来实现。 要在Unity中使用LineRenderer和UI进行连线,可以按照以下步骤操作: 1. 添加LineRenderer组件:在场景中选择一个游戏对象,然后在Inspector面板中点击"Add Component"按钮,在搜索栏中输入"LineRenderer"并添加该组件。 2. 调整LineRenderer的参数:在Inspector面板中,可以设置线条的材质、颜色、宽度等属性。可以根据需要调整这些属性以满足项目要求。 3. 定义线条的位置:通过设置LineRenderer的位置信息来定义线条的形状。可以通过设置点的坐标或通过路径来定义线条的位置。 4. 连接模型和UI元素:要将模型和UI元素连接起来,可以通过改变LineRenderer的position属性,将线条的末端连接到UI元素的位置。 举个例子来说明,假设有一个3D模型和一个UI按钮,我们希望用LineRenderer将它们连接起来: 1. 添加LineRenderer组件:选择一个游戏对象,点击"Add Component",搜索并添加"LineRenderer"组件。 2. 调整LineRenderer的参数:在Inspector面板中,可以选择合适的材质、颜色和宽度。 3. 定义线条的位置:通过设置LineRenderer的position属性,根据3D模型和UI按钮的位置来定义线条的形状。可以设置线条的起始点和终点,使其连接到模型和UI元素的位置。 4. 连接模型和UI元素:将LineRenderer的position属性调整到UI按钮的位置,使其与模型连接。 通过以上步骤,我们就可以使用LineRenderer组件将3D模型和UI元素进行连线,实现我们的需求。 ### 回答2: 在Unity中,可以使用LineRenderer组件来实现模型和UI之间的连线效果。 首先,使用LineRenderer组件创建一个连线。可以通过代码或者在Unity编辑器中手动添加LineRenderer组件来创建。然后,调整连线的宽度、颜色、材质等属性,以使其适应UI和模型的需求。 要将连线与模型连接起来,需要获取模型和UI的位置信息。可以通过Transform组件获取物体的位置信息,并将其赋给LineRenderer的起点和终点。 对于UI,可以使用RectTransform组件的anchoredPosition属性获取UI物体的位置信息。然后,将UI的位置信息作为LineRenderer的终点。 对于模型,可以使用模型的Transform组件获取其位置信息。然后,将模型的位置信息作为LineRenderer的起点。 最后,将连线的持续时间调整为0以实现连续更新。这样,无论模型和UI的位置如何变化,连线都会实时跟随。 需要注意的是,使用LineRenderer进行模型和UI连线时,由于UI物体的锚点坐标不是世界坐标,而是相对于父级UI物体的锚点坐标。因此,在进行连线时,需要将UI的坐标转换为世界坐标或者将模型的坐标转换为UI坐标。可以使用Camera.WorldToScreenPoint和Camera.ScreenToWorldPoint方法来进行坐标的转换。 通过如上步骤,就可以实现模型和UI的连线效果了。连线将会实时更新,跟随模型和UI的位置变化。 ### 回答3: Unity的LineRenderer组件可以用于创建在模型和UI元素之间的连线。在使用LineRenderer时,首先需要为其指定一个位置数组,这些位置将确定连线的路径。连接模型和UI元素的连线一般需要确定模型和UI元素的位置,然后将它们的位置添加到位置数组中。 当连接模型和UI元素时,可以通过将模型的顶点作为位置数组的一部分来获得模型的位置。这可以通过获取模型的Mesh组件,并通过遍历其顶点数组来实现。同时,也可以通过获取UI元素的RectTransform组件,并使用其position属性来获得UI元素的位置。 在设置好位置数组后,需要设置LineRenderer的宽度、颜色、材质等属性。可以通过调整这些属性来使连线更具吸引力。 另外,还可以使用鼠标在UI元素上绘制连线。可以使用Unity的EventSystem来检测鼠标点击事件,并获取点击的UI元素。当检测到鼠标点击UI元素后,可以使用LineRenderer来绘制从模型到UI元素的连线。可以在鼠标按下和抬起事件中分别设置连线的起点和终点,以实现绘制连线的效果。 总结起来,通过设置LineRenderer的位置数组和属性,可以在Unity中实现模型和UI元素之间的连线效果。无论是通过获取模型和UI元素的位置,还是通过鼠标绘制,都可以使用LineRenderer组件来实现这一效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值