DirectShow实现视频采集和虚拟摄像头

概述:通过DirectShow实现本机摄像头的视频采集,以及利用dshow模块通过手动实现IPin和IBaseFilter等实现虚拟摄像头。

总结:我们知道目前pc平台的视频采集主要有DirectShow和MediaFoundiation,而且虚拟摄像头的实现一般也是利用dshow的baseclass模块进行实现,而我们则选择通过手动实现IPin和IBaseFilter模块抛弃baseclass,从而对于DShow的采集内部流程更加了解。

首先简单介绍一下DirectShow:

DShow是windows平台上的流媒体框架,主要提供了媒体流的采集和回放功能,主要支持的格式有ASF,MPEG,AVI,MP3,WAV等。同时支持使用wdm驱动或者早期的vfw驱动进行媒体流的采集。

DirectShow是建立在组件对象模型(com)上的,因此当我们编写DirectShow应用时,需要具备Com的编写知识,后续我们会简单介绍,现在我们简单介绍一下DirectShow的接口,也是我们外部调用的一些常用接口。

IGrapBuilder:构造Filter Graph接口,建立和管理一系列的Filter。

IMediaControl:控制多媒体流在过滤图表中的流动,如启动停止等。

IVideoWindow:控制视频渲染窗口的属性。

IBaseFilter:用于定义一个具体的FIlter,实现多媒体数据的处理。

IPin:用于管理两个Filter之间的Pin,从而实现连接Filter。

ISampleGrabberCB:ISampleGrabber的回调接口,主要用于实现采集数据回调。

 

DirectShow程序是由一个个filter构成,filter执行一些多媒体流的操作,比如:读文件,采集设备获取视频,数据渲染等。filter主要包含三类:source filter,transform filter,renderer filter。

source filter:filter的数据源,这些数据可以来自文件,网络,摄像头等等。

transform filter:接收数据,数据处理传输的作用,主要是将数据传入下一个filter,如编解码fitler等。

renderer filter:处于filter链的最后,接收数据并进行渲染。如一个视频帧被渲染到窗口,一个写文件fitler将数据写入文件等。

区分filter标准最主要的是其中包含的Pin的类型,所以在此我们要简单介绍一下Pin的含义,Pin意思就是管脚的含义,有输入pin和输出pin,source filter只包含输出pin,transform filter既包含输入pin又包含输出pin,最终我们通过将对应的输入输出pin进行连接成功则后续就实现了数据流的传输,关于Filter内部的连接也是实现重点。

那么Filter是如何与Pin进行关联的?此时就涉及到了IEnumPins接口,通过该接口我们可以枚举Filter中内部的Pin对象,从而实现获取Pin的类型等参数信息。

那么在连接之前我们需要约定传输的媒体类型,该类型是如何约定的?此时就涉及到IAMStreamConfig接口,通过该接口可以进行设置和获取Filter支持的类型。

我们知道了约定的类型,和对应的pin,那么我们就可以实现对应pin的连接。连接成功后约定好对应数据的缓存,通过IMeidaControl接口启动采集。

下面就是简单的采集界面和 我们自己实现的虚拟摄像头,系统win7,64bit。

图一:本机虚拟摄像头的获取列表,其中QW DShow VCamera为我们自己实现的虚拟摄像头

DirectShow实现视频采集和虚拟摄像头_第1张图片

 图二:为我们自己虚拟摄像头进行读文件操作,并实现预览和数据保存等。

DirectShow实现视频采集和虚拟摄像头_第2张图片

总结:以上就是关于我们对DirecShow的简单介绍,后续如果喜欢的话记得订阅啊。

 

你可能感兴趣的:(DirecShow)