DirectX9.0b SDK下载地址及安装说明

今天真是混帐,花费了4,5个小时安装DirectShow。

先是下载,ms要正版的windows才能下载,郁闷;找了n久终于找到可以下载的链接

http://hotdl.com/dl/showfile.php?id=640&category=52

另外,DirectX9.0c已经将DShow分离出去了,下载时请选DirectX9.0b或者一下

再是配置DirectShow的VC开发环境
---------------------------
DirectShow开发环境
关键词: 环境配置                                          
http://mercredi.bokee.com/3057881.html
1,使用VC向导生成一个具体项目,如Win32 Dynamic-Link;

2,包含头文件streams.h;

3,在VC的菜单中选择Project|Settings|C/C++,在弹出的对话框中的Category中选择Code generation,然后在Calling convention中选择_stdcall;

4,使用多线程语言运行时库,即在VC的菜单中选择Project|Settings|C/C++,在弹出的对话框中的Category中选择Code generation,然后在Use run-time library中,Debug版选择Debug Multithreaded,Release版选择Multithreaded。

5,配置必要的链接库文件,即在VC的菜单中选择Project|Settings|Link,在弹出的对话框中的Category中选择General,然后在Object/library modules中输入如下代码:

    Debug版本   strmbasd.lib, msvcrtd.lib, winmm.lib

    Release版本 strmbase.lib, msvcrt.lib, winmm.lib

并且选中Ignore all default libraries。

DirectShow SDK建议,DirectShow应用程序应该至少连接库文件strmiids.lib和quartz.lib。前者定义了DirectShow标准的CLSID和IID,后者定义了导出函数AMGetErrorText(如果应用程序中没有使用到这个函数,也可以不连接这个库)。如果程序里包含了头文件streams.h,则一般库文件还要连接strmbasd.lib、uuid.lib、winmm.lib。

6,将DirectX SDK的Include和Lib目录配置到VC的系统目录中去,并且放在标准的VC目录之前,以保证编译器能够拿到最新版本的源文件。选择Tools|Options|Directories,在弹出的对话框中的Show directories for中选择Include files,配置如下(假设DirectX SDK安装在D:/DXSDK目录下,VC安装在C:/Program Files下):

    D:/DXSDK/Include

    D:/DXSDK/SAMPLES/C++/DIRECTSHOW/BASECLASSES

    D:/DXSDK/SAMPLES/C++/COMMON/INCLUDE

    C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE

    C:/Program Files/Microsoft Visual Studio/VC98/MFC/INCLUDE

    C:/Program Files/Microsoft Visual Studio/VC98/ATL/INCLUDE

再在Show directories for中选择Library files,配置如下:

    D:/DXSDK/Lib

    D:/DXSDK/SAMPLES/C++/DIRECTSHOW/BASECLASSES/DEBUG

    D:/DXSDK/SAMPLES/C++/DIRECTSHOW/BASECLASSES/RELEASE

    C:/PROGRAM FILES/MICROSOFT SDK/LIB

    C:/Program Files/Microsoft Visual Studio/VC98/LIB

    C:/Program Files/Microsoft Visual Studio/VC98/MFC/LIB

7,因为DirectShow应用程序是一种COM客户程序,因此在调用任何COM函数之前调用CoInitialize()(或CoInitializeEx)函数进行COM库的初始化(一般是在应用程序启动的时候调用一次),在结束COM库使用时调用CoUninitialize()函数进行反初始化(一般是在应用程序退出前调用一次)。
----------------------------
配置时的问题【一定要注意】
1。include和lib的路径前后顺序一定要“非常严格按照上面顺序排列”,否则
  1.1 DXSDK/Include和VC98/INCLUDE有头文件名是重名的,例如control.h,strmif.h。所以要优先选择DXSDK的文件声明。
  2.1 DXSDK/Lib和VC98/LIB对 DWORD_PTR 这个数据类型的声明顺序出现编译上连接的歧异!!!!

2。BASECLASSES/DEBUG和BASECLASSES/RELEASE目录和目录里面是内容是没有的,如果你在应用程序中使用了BASECLASSES里面的class,function,filter,interface,就要先用VC编译baseclasses.dsw,编译时请分别选定DEBUG和RELEASE,因为baseclasses.dsw有4个版本,而且默认下都不是DEBUG和RELEASE。编译后生成两个重要文件:strmbasd.lib(Debug),STRMBASE.lib(Release),在以后将用到。

 

 

 

开发环境
SDK:DirectX9.0b (Summer 2003)

下载地址http://www.filewatcher.com/m/dx90bsdk.exe.228594272.0.0.html
Visual C++ 6.0

参考文档:SDK文档
1) DirectShow->Getting Started->Setting Up the Build Environment
2) DirectShow->DirectShow Reference->DirectShow Base Classes->Using the DirectShow Base Classes
3) DirectShow->Getting Started->How To Play a File

 

配置说明:
1. Tools->Options->Directories
Include - 添加\Include
Lib        - 添加\Lib
             - 添加\SAMPLES\C++\DirectShow\BASECLASSES\DEBUG   // [注1]

2. Build BaseClasses
打开\Samples\C++\DirectShow\BaseClasses\baseclasses.dsp,编译debug得到Strmbasd.lib。 // [注2]

3. Project->Setting->Link
添加Strmbasd.lib

 

源代码如下

win32控制台程序

// videoCapDS.cpp : Defines the entry point for the console application.
//
#include

#include

int
main()
{
 // for playing
 IGraphBuilder *pGraphBuilder;
 ICaptureGraphBuilder2 *pCaptureGraphBuilder2;
 IMediaControl *pMediaControl;
 IBaseFilter *pDeviceFilter = NULL;

 // to select a video input device
 ICreateDevEnum *pCreateDevEnum = NULL;
 IEnumMoniker *pEnumMoniker = NULL;
 IMoniker *pMoniker = NULL;
 ULONG nFetched = 0;

 // initialize COM
 CoInitialize(NULL);

 //
 // selecting a device
 //

 // Create CreateDevEnum to list device
 CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
   IID_ICreateDevEnum, (PVOID *)&pCreateDevEnum);
   
 // Create EnumMoniker to list VideoInputDevice
 pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
   &pEnumMoniker, 0);
 if (pEnumMoniker == NULL) {
   // this will be shown if there is no capture device
   printf("no device\n");
   return 0;
 }

 // reset EnumMoniker
 pEnumMoniker->Reset();

 // get each Moniker
 while (pEnumMoniker->Next(1, &pMoniker, &nFetched) == S_OK) {
   IPropertyBag *pPropertyBag;
   TCHAR devname[256];

   // bind to IPropertyBag
   pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
     (void **)&pPropertyBag);

   VARIANT var;

   // get FriendlyName
   var.vt = VT_BSTR;
   pPropertyBag->Read(L"FriendlyName", &var, 0);
   WideCharToMultiByte(CP_ACP, 0,
     var.bstrVal, -1, devname, sizeof(devname), 0, 0);
   VariantClear(&var);

   printf("%s\r\n", devname);
   printf("  select this device ? [y] or [n]\r\n");
   int ch = getchar();

   // you can start playing by 'y' + return key
   // if you press the other key, it will not be played.
   if (ch == 'y') {
     // Bind Monkier to Filter
     pMoniker->BindToObject(0, 0, IID_IBaseFilter,
         (void**)&pDeviceFilter );
   }

   // release
   pMoniker->Release();
   pPropertyBag->Release();

   if (pDeviceFilter != NULL) {
     // go out of loop if getchar() returns 'y'
     break;
   }
 }

 if (pDeviceFilter != NULL) {
   //
   // PLAY
   //

   // create FilterGraph
   CoCreateInstance(CLSID_FilterGraph,
     NULL,
     CLSCTX_INPROC,
     IID_IGraphBuilder,
     (LPVOID *)&pGraphBuilder);

   // create CaptureGraphBuilder2
   CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC,
     IID_ICaptureGraphBuilder2,
     (LPVOID *)&pCaptureGraphBuilder2);

   // set FilterGraph
   pCaptureGraphBuilder2->SetFiltergraph(pGraphBuilder);

   // get MediaControl interface
   pGraphBuilder->QueryInterface(IID_IMediaControl,
     (LPVOID *)&pMediaControl);

   // add device filter to FilterGraph
   pGraphBuilder->AddFilter(pDeviceFilter, L"Device Filter");

   // create Graph
   pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_PREVIEW,
     NULL, pDeviceFilter, NULL, NULL);

   // start playing
   pMediaControl->Run();

   // to block execution
   // without this messagebox, the graph will be stopped immediately
   MessageBox(NULL,
     "Block Execution",
     "Block",
     MB_OK);

   // release
   pMediaControl->Release();
   pCaptureGraphBuilder2->Release();
   pGraphBuilder->Release();
 }

 // release
 pEnumMoniker->Release();
 pCreateDevEnum->Release();

 // finalize COM
 CoUninitialize();

 return 0;
}
注1:该处可根据需要添加不同版本,如RELEASE/Debug_Unicode/Release_Unicode。
注2:debug - strmbasd.lib;release - strmbase.lib;另外还有对应的Unicode版本。
注3:步骤3缺,将导致
error LNK2001: unresolved external symbol _IID_IMediaEvent
error LNK2001: unresolved external symbol _IID_IMediaControl
error LNK2001: unresolved external symbol _CLSID_FilterGraph
error LNK2001: unresolved external symbol _IID_IGraphBuilder
Debug/Howtoplayafile.exe : fatal error LNK1120: 4 unresolved externals
Error executing link.exe.

 

你可能感兴趣的:(null,generation,filter,include,interface,library)