vs2008下DirectShow的配置詳解

最近需要開發一個流媒體播放器,決定基於dshow來做。

 

以前用vc6.0開發過,所以相關配置有現成的資料可以參考。現在開發環境換成vs2008了,好些不一樣的地方。比如,在比較老的資料裏可以知道:directshow是包含在directx SDK裏面的。但這是在DirectX 9.0b之前的情況,在9.0c以後,directshow和DirectX就徹底分家了,directshow被移到了windows platform sdk裏。如果你只安裝了DirectX9.0b之後的版本,是沒有directshow的。

 

1、安裝工具:vs2008+DirectX 9.0 SDK

2、我的安裝目錄是C:/DXSDK

3、找到C:/DXSDK/Samples/C++/DirectShow/BaseClasses下的baseclasses.sln,打開後可能會提示轉換,注意留下備份。編譯通過後會生成strmbasd.lib,在debug或者release目錄下(取決於你程序生成的版本)。

 

注意點:編譯中遇到的問題及解決方法:

      3.1若定位錯誤到如下兩行:

typedef void *PVOID;

typedef void * POINTER_64 PVOID64;

則修改爲:

#define POINTER_64 __ptr64 //加上這一行

typedef void *PVOID;

typedef void * POINTER_64 PVOID64;

3.2 若for循環中變量作用域出現問題,則如下修改:

C++標準語法的問題,因爲在之前在for循環內定義的變量可以在for之外的地方使用,即在第一個for裏for(int i,...),以後的for再使用i不必再聲明,解決方法也很簡單,打開project->BaseClasses properties->configuration->C/C++->Language->Force Comformance in For Loop Scrope設置爲No即可

3.3 再次編譯,若還有其他問題,則做如下修改

打開project->BaseClasses properties->configuration->C/C++ ->Command Line,增加/wd4430選項

 

4、配置工作環境

4.1 1. 首先,點擊工具->選項->項目和解決方案->VC++目錄。如圖添加兩個引用:

 

C:/DXSDK/Samples/C++/DirectShow/BaseClasses

C:/DXSDK/Include

包含文件設置 

4.2 2. 如圖,再添加庫文件的引用。

C:/DXSDK/Samples/C++/DirectShow/BaseClasses/Debug

C:/DXSDK/Lib

 庫文件設置

 

4.1步與4.2步注意點:

請將C:/DXSDK替換爲你安裝directX所在的目錄。且我們所添加的路徑最好位於最上端,若開發環境中原來有SDK路徑,則去掉開發環境中原來的windows SDK路徑

5、新建一基於對話框的MFC程序DirectShowEx,建成後點項目->屬性->連接器 ->命令行,在附加選項中輸入strmbasd.lib

 

6、在directShowEx.h中添加

#include <dshow.h>
#include <streams.h>

 

將對話框初始化函數OnInitDialog()中的內容替代如下:

CDialog::OnInitDialog();

 // Add "About..." menu item to system menu.

 // IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
  pSysMenu->AppendMenu(MF_SEPARATOR);
  pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

 // Set the icon for this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);   // Set big icon
SetIcon(m_hIcon, FALSE);  // Set small icon

// TODO: Add extra initialization here
IGraphBuilder *pGraph = NULL;
   IMediaControl *pControl = NULL;
   IMediaEvent *pEvent = NULL;

   HRESULT hr = CoInitialize(NULL);
   if(FAILED(hr))
   {
       printf("can't coinitizlize");
       return -1;
   };
   hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void**)&pGraph);
   if(FAILED(hr))
   {
       printf("can't create filtergraph");
       return -1;
   }

   hr = pGraph->QueryInterface(IID_IMediaControl, (void**)&pControl);
   hr = pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);

hr = pGraph->RenderFile(L"F://lx.avi", NULL);//找個自己電腦上的視頻文件即可


   if(FAILED(hr))
   {
       printf("cant't renderfile");
       return -1;
   }
   hr = pControl->Run();
   if(FAILED(hr))
   {
       printf("can't run");
       return -1;
   }
   long evCode;
   pEvent->WaitForCompletion(INFINITE, &evCode);



   pControl->Release();
   pEvent->Release();
   pControl->Release();
   CoUninitialize();
   printf("Hello World!/n");
   return 0;

 return TRUE;  // return TRUE  unless you set the focus to a control

 

 

Ctrl+F5編譯運行,一切OK~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章