DirectShow使用大全
一.使用directshow时应该添加lib文件Strmiids.lib、Quartz.lib 、Strmbase.lib 具体添加那个见下面的说明
Header Files
All DirectShow applications use the Dshow.h header file. Some DirectShow interfaces require additional header files. These requirements are noted in the interface reference.
Library Files
The following table shows the library files DirectShow uses.
Library file Description
Quartz.lib Exports the AMGetErrorText function. If you do not call this function, this library is not required.
Strmbase.lib If you do not use the DirectShow base classes, this library is not required. For information about the difference between Strmbase.lib and Qtzbase.lib, see Building DirectShow Filters  Strmiids.lib Exports class identifiers (CLSIDs) and interface identifiers (IIDs). All DirectShow applications require this library.
In your build environment, the SDK Include and Lib directories should be the first directories in the search path. This ensures that you are using the most recent versions of these files.
DirectShow初探
可能到现在为止,还没有哪个玩过游戏的人没有接触过Microsoft的DirectX 的。因为现今大多数的游戏都是用DirectX开发出来的。
相比之下,DirectShow只是DirectX的一个子集。DirectX中还包括DirectSound、Direct3D等集合。 DirectShow主要用来处理一些与音视频有关的多媒体任务,比如音视频采集、回放等。过年回来后,在一个项目中要求在WIN32下采集视频信号,以前做过GDI的,不过效率低下,而且效果也很烂,
所以决定加速,怎样加速,答案就在DirectShow。
1、DirectShow的结构
我们知道,Windows操作系统只用了CPU中的两个特权级(0和3)。0是内核模式,它可以直接访问硬件;3是用户模式,它不能直接访问硬件。 DirectShow 的基本工作单元是Filter(过滤器),过滤器的就像一个筛子,它一般有输入
引脚(PIN)和输出引脚,数据从输入引脚流入而从输出端口流出。DirectShow 中的过滤器一般分为下列3类:
1) Source Filter (用于提供原始的多媒体数据,比如一个视频文件)
2)Transform Filter(用于处理从Source Filter 传过来的多媒体数据,比如MPEG-4解码器)
3)Rendering Filter(用于显示、回放和存储多媒体数据给用户,比如文件写入器)
要完成特定的多媒体功能,必须用相应的Filter组成特定的Filter Graph。多媒体数据在Graph中流动,到达Rendering Filter时回放给用户。
用户应用程序怎么样控制Filter Graph呢?他必须创建一个相应的Filter Graph Manager,应用程序向Manager发送相应的命令(Command),然后从Manager 那接收相应的Event,最后做出相应的响应。
每个Filter都有操作硬件的能力,这就是为什么DirectShow能如此高效的使用多媒体了。
DirectShow的结构原理图如下:
2、使用DirectShow编写一个简单的应用程序
使用DirectShow编写应用程序的一般步骤如下:
1)根据系统完成的功能构建相应的Filter Graph。
2)构建Graph中的每个Filter,并将它们连接起来。
3)创建Filter Graph Manager,运用Application控制Manager,从而
控制整个的流程。
4)DirectShow是基于COM(组件对象模型)的,所以在编写Filter前
必须初始化COM库。
下面是一个完整的播放AVI文件的小程序,其中的注解说明了编程的步骤。
#include <stdio.h>
#include <dshow.h>    //DirectShow必须包含的头文件,LIB库为
Strmiids.lib 和 Quartz.lib
int main()
{
IGraphBuilder *pGraph = NULL;      //  用于创建Filter Graph的接口
IMediaControl *pControl = NULL;    //  用于向Filter Graph Manager发
送Command
IMediaEvent  *pEvent = NULL;        //  用于接收Filter Graph Manager发出的Event
// Initialize the COM library.
HRESULT hr = CoInitialize(NULL);  //初始化COM Library
if( FAILED(hr) )
{
fprintf(stderr,"could not init the COM library!");
return 0;
}
//创建Filter Graph Manager
hr =
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGra phBuilder,(void **)&pGraph);
if( FAILED(hr) )
{
fprintf(stderr,"could not create Filter Graph Manager!");
return 0;
}
//查询并获得接口指针
hr = pGraph->QueryInterface(IID_IMediaControl,(void **)&pControl);  hr = pGraph->QueryInterface(IID_IMediaEvent,(void **)&pEvent);
// RenderFile库函数是少数几个能够自动创建Graph的成页,所以这里省去了创建Graph这一步
hr = pGraph->RenderFile(L"e://football.avi",NULL);
if( SUCCEEDED(hr) )
{
hr = pControl->Run();
if( SUCCEEDED(hr) )
{
// 等待视频结束
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
// 无限等待
}
}
pControl->Release();
pEvent->Release();
pGraph->Release();
//释放接口
CoUninitialize();  //御载COM 库
return 0;
}
三、
用DirectShow实现视频采集
DirectShow作为DirectX的一个子集,它为用户提供了强大、方便的多媒体开接口,并且它拥有直接操作
硬件的能力,这使得它的效率远胜于用GDI等图形方式编写的多媒体程序。前面一篇文章已经对DirectShow作了粗略的介绍,阐述了它的原理及一些编程方法。这里结合实践中运用DirectShow实现视频采集(WIN32)来加深对DirectShow的理解和操作能力。
enum怎么用
1.系统环境及开发环境
●系统支持DirectX(Win 2K以上系统)
●VC++    6.0安装有DirectX SDK(最好与系统支持的DirectX版本相同)
●视频采集设备(如USB摄像头,本文以USB PC Camera 310P为例)
2.基本思想
DirectShow的基本原理是多媒体数据在过滤器图表(Filter Graph)中流动,通过过滤器图表中各过滤器(Filter)实现在功能,最终实现多媒体数据在渲染过滤器(Vendering Filters)中的显示和回放。
前面我们已经知道,一般过滤器可分为三类:源过滤器(Source Filters)、转换过滤器(Transform Filters)、渲染过滤器(Vendering Filters)。它们分别完成数据提供、数据格式转换(压缩编码等)和数据渲染和回放功能。所以,为了实现在W IN32系统下的视频采集,我们首先要构造出一个适当的过滤器图表,然后通过应用程序对过滤器图表的管理来完成视频采集的功能。
这里我们一般需要2至3个过滤器。为什么这个数字会不准确呢?那是因为一方面系统采集设备的驱动模型是不确定的(一般有WDM和VFW两种);另一方面同一采集设备它们的Filter会由于驱动程序的差异造成Filter中引脚(Pin)的不一致;还有就是不同总线的采集设备(P CI、USB、A GP)它们的Filter也是不一致的。比如:同为USB摄像头,有些Filter有两个输出引脚(Capture和Preview);而有些Filter则只有一个输出引脚(Capture)。这里Preview引脚用来将做视频预览,Capture引脚用来将输入数据以供编码、保存等用处。
这几个过滤器分别是:
●Video Capture Filter 采集设备Filter
●Smart Tee Filter 将没有Preview引脚Filter的Capture引脚分为两支数据流(可选)
●Video Venderer视频渲染及回放Filter
通过上面3个过滤器,我们可以构造出一个完整的视频采集过滤器图表(如图1)
图1
我们也可以对上面的过滤器图表稍做修改,将它变为一个既可以预览视频,又可以将视频保存为媒体文件的图表(如图2)。