开始研究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
今日推荐
周排行