DirectShow概念
DirectShow(有时缩写如DS或DShow),开发代号Quartz,是一种由微软公司开发的能够让软件开发者对媒体文件执行各种不同处理的应用程序设计接口。基于微软公司Windows组件对象模型(COM)框架,DirectShow为大部份微软公司程序设计语言提供了一个媒体的普遍接口,而且是一个可扩展的,能在用户或开发者的命令下播放或记录媒体文件的,以Filter为基础的框架。DirectShow开发工具及凭证被加入到微软公司SDK平台的一部份。Windows Media Player这样的应用程序运用DirectShow或者它的各种派生来播放来自文件或是互联网上的内容。DirectShow's的最大的竞争对手是苹果计算机的QuickTime框架。
DirectShow设计模式
DirectShow运行的方式通常是一个开发者创建一个Filter Graph,把一些Filter - 可能订制 - 加入Filter Graph,然后播放文件,或者播放来自互联网或照相机的数据。当播放进程运行时,Filter Graph在Windows注册中寻找注册了的Filters并且为这些Filter创建本地提供的Graph。在这之后,它将所有的Filter连接在一起,并且在开发者的请求下,播放/中止创造的Graph。
1 平台介绍
win 7。
我不知道以下做法是不是vs2010与directshow操作正确的唯一途径,但是我经过以下安装和配置之后就可以写DirectShow程序和开发filter(继承父filter)了。
2 软件安装
2.1 安装顺序
按照下面的顺序安装软件:
(1)visual studio 2010
(2)Windows sdk 7.1
(3)Visual studio 2010 sp1
(4)VC-Compiler-KB2519277.exe
各软件的下载网址我就不粘贴了,可以用google搜索的。
2.2 注意
(1)在安装Windows SDK之前,一定要先卸载比Microsoft Visual C++ 2010 x86(x64) Redistributable - 10.0.30319更高的版本(不包括Microsoft Visual C++ 2010 x86(x64) Redistributable - 10.0.30319),如果你是首次安装vs,这个问题就不存在。
(2)在安装windows sdk的时候不要安装VC编译器,在安装完vs 2010 sp1后再安装VC-Compiler-KB2519277.exe补上。
至于每一个软件的安装过程就不贴图了,图比较多。如果不清楚的话可以到谷歌里搜一下作为参考的。具体看开发需要。
3. DirectShow程序开发配置
只是开发direcshow程序时,如只进行视频预览而不继承父filter时的配置如下:
打开VS2010的Property Manager 即属性管理器,右键当前项目-->properties(属性)-->VC++ Directories
在Include Directories中添加Directshow以下目录:
C:\Program Files\Microsoft SDKs\Windows\v7.1\Include
在Library Directories中添加DirectShow的库目录:
C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib
好了,可以开发DirectShow程序了。
4. filter程序开发配置
4.1编译BaseClasses
一般来说开发filter的程序需要用到filter基类,directshow的基类在(SDK samples root)\DirectShow\BaseClasses下。所以首先需要用vs2010来build BaseClasses项目,使之生成相应的库文件。在开始中以管理员的身份打开vs2010,然后打开BaseClasses项目,分别以Debug(生成strbasd.lib库文件,供debug项目所调用)和Release(生成strbase.lib库文件,供release项目所调用)方式Build(F7)baseclasses项目(不要用Debug,用了Debug之后可能会出现找不到BaseClasses.lib的错误提示)。
4.2 配置vs2010
4.2.1 包含目录
依然打开vs2010 属性管理器,然后经相同的步骤到VC++目录下:
在Include Directories中包含direcshow目录如下:
C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses
C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\common
C:\Program Files\Microsoft SDKs\Windows\v7.1\Include
在 Libray Directories中包含以下目录:
C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib
C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\Debug
C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\Release
4.2.2 注意
注意以上头文件的包含顺序!!
4.2.3 如果目录包含顺序不对
如果包含目录顺序不对则会出现以下错误:
1>e:\microsoft sdks\windows\v6.0\samples\multimedia\directshow\baseclasses\refclock.h(80) : error C2061: syntax error : identifier ''CAMSchedule''
1>e:\microsoft sdks\windows\v6.0\samples\multimedia\directshow\baseclasses\refclock.h(139) : error C2143: syntax error : missing '';'' before ''*''
1>e:\microsoft sdks\windows\v6.0\samples\multimedia\directshow\baseclasses\refclock.h(139) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>e:\microsoft sdks\windows\v6.0\samples\multimedia\directshow\baseclasses\refclock.h(139) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>e:\microsoft sdks\windows\v6.0\samples\multimedia\directshow\baseclasses\refclock.h(139) : warning C4183: ''GetSchedule'': missing return type; assumed to be a member function returning ''int''
1>e:\microsoft sdks\windows\v6.0\samples\multimedia\directshow\baseclasses\refclock.h(178) : error C2143: syntax error : missing '';'' before ''*''
1>e:\microsoft sdks\windows\v6.0\samples\multimedia\directshow\baseclasses\refclock.h(178) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>e:\microsoft sdks\windows\v6.0\samples\multimedia\directshow\baseclasses\refclock.h(178) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>e:\microsoft sdks\windows\v6.0\samples\multimedia\directshow\baseclasses\refclock.h(139) : error C2065: ''m_pSchedule'' : undeclared identifier
1>e:\microsoft sdks\windows\v6.0\samples\multimedia\directshow\baseclasses\refclock.h(166) : error C2227: left of ''->GetEvent'' must point to class/struct/union/generic type
第一次出现这个错误后就去将vs2010的环境配置目录修改为以上顺序吧。好像只要编译通过了,包含目录的顺序就无所谓了。