开始研究Directshow


开始研究Directshow
2011年09月19日
  重要提醒:系统检测到您的帐号可能存在被盗风险,请尽快查看风险提示,并立即修改密码。  |  关闭
  网易博客安全提醒:系统检测到您当前密码的安全性较低,为了您的账号安全,建议您适时修改密码    立即修改  |  关闭
  要短时间内编写一个播放器,还是粗略的学习一下Directshow吧,在这里稍微记录一下。
  用了三天看完《directshow开发指南》,没有感觉,还是要靠例子入门。
  首先运行书上的例子,配置环境很麻烦~但感觉原因是因为书带的源码有问题,在网上下载的源码就可以正确运行~
  下面贴一些解决问题的过程中搜到的答案:
  最主要的问题是directshow的版本与编译器的匹配
  错误提示信息:fatal error C1083: Cannot open include file: 'streams.h': No such file or directory
  错误原因:找不到streams.h这个文件
  解决方法:
  1) 安装directX sdk
  2)打开安装目录下的dshow.dsw,进行编译
  3)在VC++的Tools/Option/Directory的Include和Library中分别加入
  C:\DXSDK\Include
  C:\DXSDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES
  C:\DXSDK\SAMPLES\C++\COMMON\INCLUDE
  C:\DXSDK\Lib
  C:\DXSDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES\DEBUG
  4)在编译你工程前,在Project\Setting\Link\ 中加入 strmbasd.lib uuid.lib winmm.lib
  fatal error C1083: Cannot open include file: 'dshow.h': No such file or directory
  2010-07-14 17:04:14
  i m using ur code in my application but there is a reeor for dshow.h file
  that is "fatal error C1083: Cannot open include file: 'dshow.h': No such file or directory"
  can u help me how can i remove this error.
  i m using realtek HD audio driver.
  thanks 
  //--------------------------------------残念-------------------------------------------
  Just connect your filter through
  this link:
  http://directshow.wonderu.com/samples
  translated:
  http://translate.google.com/translate?u=http://dir ectshow.wonderu.com/samples&langpair=ru|en&hl=en&ie =UTF8">http://translate.google.com/translate?u=http: //directshow.wonderu.com/samples&langpair=ru|en&hl= en&ie=UTF8
  and render it down.
  XD
  //----------------------------------残念二---------------------------------------------
  试验了几天,看来 DirectShow真的是从DirectX中分离出去了,可以装一个DirectX 的Extract的包,里面就是DirectShow,也可以装一个Platform SDK,里面同样也包含DirectShow。
  我们的集成开发环境选择了Visual C++ 6.0 With SP6,但默认情况下,它不包括DirectShow的开发包。为此,我专门上微软的网站下载了DirectX SDK(April 2007版),但安装完成后,在编程中依然发现说找不到Dshow.h的头文件。开始以为是环境没配置好,但发现配置好环境后,问题依旧。搜索整个硬盘,确实是不存在这个文件。
  查阅相关的资料后,得出以下的结论:现在的DirectShow    SDK 不被整合在DirectX SDK中而是以Extras 的形式发布.DirectShow SDK的最后一个版本是在2005.2版的DirectX SDK Extras中。
  也就是说DirectShow从DirectX中分离出去了,需要额外的安装。可以安装DirectX Extras,也可以安装一个Platform SDK,该SDK包含有DirectShow的部分。
  安装好后,其实主要是解压释放。我们需要在VC的选项里设置一下。在 Tools->Option的选项卡Directories中增加相应项目。在Include files增加DirectX,DirectShow的Include路径,在Library files中增加DirectX,DirectShow的Lib路径。很重要的一点就是这些路径必须要放置在原有库文件路径后面,因为它的搜索顺序是从上到下,因为这些DirectX,DirectShow的库文件中要调用到系统基本的库,但这些库由于在顺序在它们之后,未被初始化,会造成引用错误,切记。
  环境配置好之后,开始编程。编写完相关代码后,在运行时出现以下错误:
  2007/04/27
  --------------------Configuration: MediaPlayer - Win32 (WCE x86) Release--------------------
  Linking...
  MediaPlayerDlg.obj : error LNK2019: unresolved external symbol _CLSID_FilterGraph referenced in function "protected: void __thiscall CMediaPlayerDlg::OnPlay(void)" (?OnPlay@CMediaPlayerDlg@@IAEXXZ)
  MediaPlayerDlg.obj : error LNK2019: unresolved external symbol _IID_IGraphBuilder referenced in function "protected: void __thiscall CMediaPlayerDlg::OnPlay(void)" (?OnPlay@CMediaPlayerDlg@@IAEXXZ)
  X86Rel/MediaPlayer.exe : fatal error LNK1120: 2 unresolved externals
  Error executing link.exe.
  MediaPlayer.exe - 3 error(s), 0 warning(s)
  从反馈信息上看,是由于链接库有问题造成的。经过调试,解决办法是要在Project ->Setting里的Link里增加一个库文件:strmiids.lib。 
  下载DirectX SDK Extras,解压到SDK的安装路径中。然后按照步骤1中进行。
  可是还是出现cannot compile the file"dshow.h":no compile tool is associated with the file的错误
  转
  这几天在学DirectShow的开发,一个streams.h头文件折腾了好几天才搞定。简单总结一下出现缺少streams.h的解决方法和DirectShow开发环境的搭建。
  开发包方面,我用的是Microsoft DirectX 9.0 SDK。
  streams.h这个头文件现在在%\DX9 SDK\Samples\C++\DirectShow\BaseClasses路径下,首先要把这个路径添加到VC的Include Directories下面。TOOL--option--directories下面框里添加上streams.h的目录)。
  debug版的库 strmbasd.lib在安装包\DX9 SDK\Samples\C++\DirectShow\BaseClasses\Debug_Unico de目录下
  retail版的库strmbase.lib在%\Program Files\Microsoft Visual Studio\VC98\Lib目录下
  因为库有两个,分别对应Debug和Release,你可以把它拷到SDK的Lib目录下,然后在工程的Debug设置和Release设置里设好库的名字就可以了,当然也可以不拷,怎么用随便你。
  安装完directx sdk后,要将directx sdk的include和lib目录配置到vc的系统目录中,并且放到标准的vc目录之前,以保证编译器能拿到最新版本的源文件。
  配置方法为,打开vc,选择菜单项tool、options、directories,在弹出的对话框中的show directories for中选择include files,添加配置如下(假设directx sdk安装在D:\dxsdk目录下):
  D:\dxsdk\include
  D:\dxsdk\samples\c++\directshow\baseclasses
  D:\dxsdk\samples\c++\common\include
  再在show directories for中选择 library files,添加配置如下:
  D:\dxsdk\lib
  D:\dxsdk\samples\c++\directshow\baseclasses\debug
  D:\dxsdk\samples\c++\directshow\baseclassed\releas e 
  按照要求,把库全部添加后,又出现“error C2501: 'IGraphBuilder' : missing storage-class or type specifiers”一系列的问题。
  是因为缺少dshow.h,没有加这个头文件
  然后link的时候依然出问题,是directshow\baseclasses中的问题“syntax error : identifier 'DWORD_PTR'”
  这种编译问题肯定还是开发环境配置问题。
  1.   你编译了sdk基类源代码吗?就是打开DXSDK9\Samples\C++\DirectShow\BaseClasses\baseclas ses.dsw进行编译,生成strmbasd.lib和strmbase.lib。
  2.   再次确认你的VC设置,包括include和lib的路径。确认sdk的路径放在vc标准的路径之前。具体参考《开发指南》P67。
  请参考《开发指南》P66-67,并一条一条检查过去!
  在编译baseclasses.dsw的过程中,又出现了错误,没有编译成功。
  “error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int”
  你函数 没有返回值 C 里面是默认返回int, C++ 比较严谨 必须要写返回值
  申明函数时候需要指定返回类型,如果你不需要返回数据则申明为void ***()
  VC6可能可以通过,但是08下默认是绝对不行的。
  uint还区分大小写~~~
  解决问题,在连接时还是出现了问题“syntax error : identifier 'DWORD_PTR'”
  以前因为在VC6.0中先编译一些东西,把DirectX 的include file 路径添加在了VC自身include file 路径之后,
  此问题的解决方案,就是把DirectX 的include file 路径挪到前面。(没有解决)
  DirectX SDK版本与Visual Studio版本 
  http://user.qzone.qq.com/32871973/blog/1233039885
  有关direct show编译问题汇总:
  注意:
  以下配置均以vc6为主.
  一、配置方法
  1 先编译Samples\C++\DirectShow\BaseClasses中的工程文件。
  注意工程的默认选项是 Debug_Unicode的,在非Unicode的工程中使用还需要编译Debug版本的。
  注意:
  一般用 ansi debug版.不怕麻烦把release也生成,取出该strmbasd.lib(strmbase.lib).
  放在dxsdk中的lib中.
  2 需要设置好VC中目录的设置 include的目录中添加 C:\DXSDK\Samples\C++\DirectShow\BaseClasses Lib的目录中添加 C:\DXSDK\Samples\C++\DirectShow\BaseClasses\Debug
  注意:
  建议把把classes 把头文件可以单独拷贝到dxsdk的include和lib中
  3、使用DirectShow的工程需要添加下面两个头文件
  #include   //DS接口、基类的定义
  #include    //CComPtr模板的定义
  #pragma comment(lib,"strmbasd.lib")
  #pragma comment(lib,"winmm.lib")
  #pragma comment(linker,"/NODEFAULTLIB:libcmtd.lib")
  注意:
  VC自带的库中也有strmbasd.lib文件。
  一定要保证连接到DS的库中,否则会出现 
  strmbasd.lib(dllsetup.obj) : error LNK2001: unresolved external symbol "class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)
  strmbasd.lib(dllentry.obj) : error LNK2001: unresolved external symbol "class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)
  strmbasd.lib(dllsetup.obj) : error LNK2001: unresolved external symbol "int g_cTemplates" (?g_cTemplates@@3HA)
  strmbasd.lib(dllentry.obj) : error LNK2001: unresolved external symbol "int g_cTemplates" (?g_cTemplates@@3HA) 之类的错误。
  以上link报错各异,最好把lib的位置上下调调,别链到vc自带的库中.鬼问题名堂太多,有时也和direct showsdk版本有关.
  二.编译后出现的错误:
  1 syntax error : identifier 'DWORD_PTR'
  如下:
  e:\directx9\samples\c++\directshow\baseclasses\wxu til.h(53) : error C2061: syntax error : identifier 'DWORD_PTR'
  e:\directx9\samples\c++\directshow\baseclasses\ctl util.h(43) : error C2504: 'IBasicVideo2' : base class undefined
  e:\directx9\samples\c++\directshow\baseclasses\ctl util.h(904) : error C2146: syntax error : missing ';' before identifier 'm_dwAdvise' e:\directx9\samples\c++\directshow\baseclasses\ctl util.h(90) : error C2501: 'DWORD_PTR' : missing storage-class or type specifierse
  如果发生这种情况,你应该从"Tools"目录中选择"Option",
  然后在include directory中将Platform SDK加到VC inlcude中.
  注意:
  1. 没有该sdk,需要先下载platform sdk. 在我的随笔中包含该链接.
  2. 要放在Include最前面.
  2 LINK : fatal error LNK1104: cannot open file "mfc42ud.lib" mfc42ud.lib是专门给unicode用的 build-->set active Configuration--> XXX win32 debug 这样就可以了 
  3“CComPtrerror C2143: syntax error : missing ';' before 'error C2501: 'CComPtr' : missing storage-class or type specifiers
  error C2059: syntax error : 'error C2238: unexpected token(s) preceding ';'
  原因:缺少文件,在vc6中是atlbase.h,可能在.net中是atlcomcli.h
  解决方法:在stdafx.h中加入#include
  注意:
  以上lib路径要对.
  5 调用CoInitializeEx(),编译后显示未定义
  CoInitializeEx()是利用COM组件时每个线程都要调用的函数,
  使用这个函数需要有如下设置:
  在Project -> setting -> C/C++标签下的Preprocessor definitions中加入"_WIN32_WINNT=0x400"语句
  在给VC6配置Directshow SDK时,很多人会出现C2146和fetal error C1004问题,作为对CSDN和各位大虾的回报,特写此文,以飨读者!
  症状:/include/strmif.h(1022) : error C2146: syntax error : missing ';' before identifier 'HSEMAPHORE' 
  出现此问题,主要是strmif.h定义不完善,有以下解决办法:
  a方法:在VC的菜单Tools | Options | Directories| 的include中,把D:/Microsoft Visual Studio/VC98/INCLUDE,就是VC自带的include放置于DXSDK的include之前。
  b方法:修改DXSDK中的头文件。在strmif.h中找到typedef DWORD_PTR HSEMAPHORE; 在其上一行加入如下两条语句 typedef unsigned long LONG_PTR;  typedef unsigned long DWORD_PTR; 然后找出DXSDK中的control.h,定位到typedef LONG_PTR OAEVENT;在其上一行加入typedef unsigned long LONG_PTR;,保存修改,然后重新编译,rebuild all,就可以了!
  两种方法都可以,用一种就行了。
  欢迎交流!
  
  
  

猜你喜欢

转载自iog689mq.iteye.com/blog/1359508