DirectShow 视频捕获(2)

 Capture Performance

原文:http://msdn.microsoft.com/en-us/library/aa452496.aspx

这部分描述一些使用directShow时主要影响捕获性能的因素。要看整体的DirctShow结构看View Capture章节。

你为设备组件选择的颜色空间对你设备的捕获性能有重要的影响。最主要考虑的因素是捕获的数据从一种颜色空间转换到另一种颜色空间穿过捕获图的次数。一般情况下,Capture Graph Builder发现两个相连的引脚之间的颜色空间不一样时会插入一个颜色空间转换过滤器。

要避免颜色空间转换,特别是当你使用一个不能实时的编码器。当你的编码器不能实时编码,Capture Graph Builder会插入一个缓冲过滤器到捕获图表中。为了能够流畅的预览,缓冲过滤器运行在BELOW_NORMAL优先级的线程中。这样减缓了捕捉过程,使得图表中的其他部分效率低下,例如颜色转换,整体消耗更大。

除了简单的增加捕获过程的计算负担,颜色空间转换过滤器的出现有两个而外的副作用。首先,它限制了 下游过滤器的输入格式 到 颜色空间转换的输入格式 的选择。例如,颜色空间转换过滤器不能处理YCbCr4:2:2平面格式到RGB16格式的转换。结果是YCbCr4:2:2平面颜色不能用来预览显示,因为预览显示必须能够用GDI渲染,因而必须转换成RGB格式。通过第三方的颜色转换过滤器能够解决这样的问题。

其次,颜色空间转换过滤器不能传递一个指向覆盖面的指针到摄像头驱动。颜色转换器内部保留这个指向覆盖面的指针,用传递指向系统内存的指针到摄像驱动代替。摄像驱动会用图像数据填充系统内存,颜色空间转换会拷贝这些数据到覆盖表面的缓冲区。这种设计对于控制驱动安全和支持不支持聚散DMA的硬件都有帮助。摄像驱动只会填充在初始化时注册的缓冲区。在初始化时,视频渲染器还不知道DirectShow并且没有创建DirectShow表面。

如果预览显示设备使用GDI渲染,那么3引脚的摄像设备应能能够使用RGB格式,而不要声明。如果你相同情境下使用两引脚的摄像设备,那么你必须确认编码器是否支持RGB颜色格式。如果你的编码器只支持YCbCr格式,那么你必须使用第三方颜色转换器。

如果显示预览显示设备使用DirectShow渲染RGB涂层,那么你必须明确的引入颜色 转换过滤器到捕获图中。Windows Mobile 5.0摄像应用不能处理这种情况。

 

静态图片捕获

 

使用windows Mobile 5.0 ,你可以使用影像下沉过滤器从视频流中捕获一个静态的图片(参考Image Sink Filter)。YCbCr格式比RGB格式更紧凑,因此在视频数据中更适合,但是在影像下沉过滤器不支持输入YCbCr格式。一种解决从YCbCr数据格式获取静态图片的方法是引入第三方颜色转换过滤到过滤图表中。如果你的硬件支持,更好性能的方法是通过硬件加速在显示设备上支持YCbCr数据格式。

为了在硬件上支持JPEG编码,摄像设备必须暴露MEDIASUBTYPE_IJPG媒体数据类型,这样驱动可以直接编码。驱动只要一次出入包含编码好的JPEG数据的缓冲区到捕获图表中,影像下沉过滤器就可以直接通过简单的I/O操作记录数据。

 

 

视频预览

有些时候摄像驱动的分辨率和预览显示的不匹配,所以视频渲染必须在预览 管道上执行缩放操作。最高效的解决方法是使用DirectDraw暴露的硬件内置的缩放设备。如果DirectDraw支持不能用,那么缩放操作可以通过GDi在软件层操作,但数据只有在RGB格式的情况下才能用。如果视频数据是YUV格式的,那么你必须在你的显示驱动中剔红自己的优化的缩放路由。

你可能感兴趣的:(windows,image,filter,Graph,mobile,performance)