愚昧的抓图问题,但还是还是想问

XLLeon 2005-06-14 05:51:32
为什么printScreen无法抓dx显示的东西呢?printscreen原理?是与对现存的访问有关么?迫切想知道详解。望高手赐教!但教人GetCurrentImage的东西就不要写了。原理,原理!希望得到的是why而不是how to^_^
...全文
185 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
XLLeon 2005-07-08
  • 打赏
  • 举报
回复
后面一段,基本上不懂……:( thank you
zhaojian999 2005-06-30
  • 打赏
  • 举报
回复
大家知道,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中。
zhaojian999 2005-06-30
  • 打赏
  • 举报
回复
在进行软件解码时,数字式(Digital)视频信号会通过一种称为“视频覆盖”(Video Overlay)的技术进行处理。通过“视频覆盖”,显示卡就会在当前桌面上绘制一个新的图像层来显示视频图像,这也正是为什么我们可以在电脑的桌面上开一个小窗口播放视频节目如VCD/DVD的原因。由于这个图像层有自己的显示设置(和Windows的桌面显示设定是不同的),即使你通过调整显示卡的亮度或者对比度使桌面显示效果看起来不错,但这对DVD等视频播放的效果却没有一点作用。

修改显示卡的“视频覆盖”设定  首先,我们要找出视频覆盖的调整选项。现在的显示卡驱动程序都提供了方便的显示管理功能。从“设置”-->“控制面板”-->“显示”,然后再选择其中的“设置”页面,点选“高级”按钮就可以找到有关“视频覆盖”(Overlay)的选项。当然,如果大家的显示卡没有提供“Video Overlay”的选项,例如全内置主板上的图形芯片,笔者就无能为力了。

  各个显卡厂商对“Overlay”的翻译也不尽相同,称为“覆盖”或者“重叠”之类的都有。以笔者的Nvidia Geforce MX400显卡为例,就是叫“重叠控制”,大家可以自己分辨。
zhaojian999 2005-06-30
  • 打赏
  • 举报
回复
你查找一下关于overlay的资料吧。
show 2005-06-24
  • 打赏
  • 举报
回复
如查dx不是用的overlay技术是可以直接抓的
XLLeon 2005-06-23
  • 打赏
  • 举报
回复
能有细节一点的解答么,高手帮帮忙
寻开心 2005-06-15
  • 打赏
  • 举报
回复
directx有一个设置,可以允许printscreen截屏的

dx当中有一个技术叫做overlay,它是直接输出到屏幕上,不是在显存当中的,要抓取它需要更复杂的技术
httpaspjspphp 2005-06-15
  • 打赏
  • 举报
回复
使用了硬件加速啊
所以你捉不到啊
XLLeon 2005-06-14
  • 打赏
  • 举报
回复
显存……写错了

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧