基于Directshow的视频缩放的技术措施
在日常学习工作中经常会对各种视频文件进行分析,比如视频的剪切、缩放等,但是对于这些操作可能会用到专业的视频分析卡等硬件的支持。针对硬件价值较高,微软提供了一套基于COM的流媒体处理开发包
DirectShow。在DirectShow中提供了完整的视频分析处理接口DES,负责对各类视频进行分析处理。
通过DES、Filter Graph可以对视频进行缩放处理,使视频的缩放脱离硬件的直接支持,适合于个人PC机上的视频处理。本文主要分析了3中视频缩放的方法,通过这些方法可以进一步加快视频缩放的速度和效率。
1 Directshow简介
利用Directshow对视频进行缩放处理,必须对Directshow的架构,DES(Directshow Editing Services)以及Filter Graph Manager等知识有所了解。
1.1 Directshow的体系结构
Directshow本质上就是基于COM组建的流媒体开发包,它为我们用户提供了一整套完整的视频处理接口。该体系结构大致可分为3层:用户应用层、Directshow接口层、底部设备层。
1.2 Filter以及Filter Graph Manager
Filter其实就是一种叫做过滤器的COM组件,一共有三种类型的Filter:Source Filter、Transforill Filter、Rendering Filter。它们都包含一个或多个Pin,Source Filter负责视频的采集,输入等;Transform Filter负责对视频进行格式转换、传输等;Rendering Filter负责视频文件的渲染,输出。
由于每一个Filter都有Pin针,我们可以根据不同的任务、需求,将各种Filter利用Pin针连接起来,就构成了一个Filter Graph。Filter Graph的构建都是有Filter Graph Manager管理的,每一个Filter Graph MaRager都对所有的Filter有所了解(Filter必须在该电脑上进行注册)。并且,它能通过命令与事件的方式与用应层进行交流,应用层也可以更加方便的对Directshow的各种接口进行处理。
1.3 非线性编辑(DES)
DES是一套基于Directshow核心框架的编程接口,它的目的是为了简化视频编辑任务,弥补Directshow对于媒体文件的非线性编辑支持的不足之处。其实,DES并没有超越Directshow Filter架构,只是在它之上的一层增强应用。
2 视频缩放分析
有了以上的几个Directshow基本知识后,我们就可以有以下几种视频的缩放方法。
2.1 Filter Graph Manager的视频缩放
我们知道Filter Graph Manager可以建立并控制Filter Graph。它是学习Directshow的核心,为了方便我们更加方便的操作,Directshow为我们提供了一整套完善的接口,通过实现这些接口我们可以完成我们想要的工作。
我们想要实现视频的缩放,可以通过FiRer Graph Manager中的IVideo Window接口来实现。IvideoWindow可以设置视频窗口的各种属性,当用户改变视频的大小的时候,操作系统以命令的方式发送给应用程序,应用程序可以调用IvideoWindow的put Height(long Height)和put_Width((long Width)改变大小。但是这种改变视频大小的方法只是单纯的改变面积并没有涉及对图像的算法剪切,因此在改变大小的过程中可能出现图像的失真等状况,下面的这种方法可以对图像进行设计。
2.2 DES的视频缩放
要利用DES对视频进行处理,首先必须要知道DES的内部结构模型如下图:
2.3 Resize Filter的视频缩放
除了在进行非线性编辑的时候在组上进行视频大小的设置之外,还有另外一种方法可以进行视频的缩放控制,这便是通过第三方的视频图像缩放Filter来控制视频的缩放。一般的DES创建的视频解码链路如下图:
在DES中默认的使用的是微软公司的Resize Filter,它采用的是简单拉伸的图像算法,使用该Filter之后可能引起视频图像的质量损坏。由此,我们可以采用第三方的Filter或是自己定制自己所需要的视频缩放Filter。一般的Resize Filter都是一个Transform Filter,因此我们在定制Filter的时候必须要继承CtransforinFilter这个父类,对于CtransfonnFilter的子类我们必须要重载以下五个纯虚函数:CheckInputType、CheckTransform、DecideBufferSize、GetMediaType、Transform。通过CheckInputType来检查本Filter的输入媒体是否合法,CheckTransform来检查开发的filter的输出是否和合法,通过GetMediaType来获取该输出端口支持的媒体格式供下游filter的枚举,通过DecideBufferSize来确定buffer的数量和大小。而上游Filter传过来的sample,我们可以继承CTransformFilter::Transform方法来处理该sample的相关数据。大体流程如下:
3 结束语
在日常生活中各种我们可以获得各种视频资源,它们作为一种信息的传播载体在信息的传播中发挥了越来越重要的作用,但是不能否认的是从视频资源中获取我们所需的信息需要更多的时间更多的心思,因此个人视频编辑越来越重要,如何将手中的视频资源进行编辑(剪切,缩放等)就越来越重要。本文中提出的3种基于Directshow的视频缩放的处理方案基本上可以解决日常个人视频缩放处理所需,当然论文中也有很多不足之处,尤其是自己定制Filter中视频缩放的算法只是一种高效的算法,可能还有更多更高效的算法,因此对于视频缩放的方法还有待优化和提高,作者也将继续研究更加高效的方法以实现真正的适合于个人PC机上的视频处理方案。