vs2008下directshow的配置

来源:互联网 发布:贝叶斯算法 知乎 编辑:程序博客网 时间:2024/06/10 00:49

近来由于要做一个流媒体播放器,调研后决定在directshow的框架下做。

  在比较老的资料里可以知道:directshow是包含在directx SDK里面的。这里要强调一点,这是在DirectX 9.0b之前的情况,在9.0c以后,directshow和DirectX就彻底分家了,directshow被移到了windows platform sdk里。如果你只安装了DirectX9.0b之后的版本,是没有directshow的。

  我的安装目录是C:\Program Files\Microsoft DirectX SDK (December 2005)。安装好了后,找到C:\Program Files\Microsoft DirectX SDK (December 2005)\Samples\C++\DirectShow\BaseClasses下的baseclasses.sln,打开后可能会提示转换,注意留下备份。编译通过后会生成strmbasd.lib,在debug或者release目录下(取决于你程序生成的版本),第一步工作就结束了。如果编译的时候出现错误,一般是一些变量定义方面的错误,VS2k8不支持默认int定义,也就是说你如果不指定一个数据的类型,编译器会生成一个错误。而directshow里的sample代码很多都是基于VC6版本的老代码。总之根据编译器的提示把变量类型声明添上就行了,不难。

  第一步工作完成后,就可以开始用directshow了。下面是使用前的准备工作。

  1. 首先,点击工具->选项->项目和解决方案->VC++目录。如图添加两个引用:

C:\Program Files\Microsoft DirectX SDK (December 2005)\Samples\C++\DirectShow\BaseClasses

C:\Program Files\Microsoft DirectX SDK (December 2005)\Include

注意:请将C:\Program Files\Microsoft DirectX SDK (December 2005)替换为你安装directX所在的目录。

vs2008下directshow的配置

  2. 如图,再添加库文件的引用。

C:\Program Files\Microsoft DirectX SDK (December 2005\Samples\C++\DirectShow\BaseClasses\Debug

C:\Program Files\Microsoft DirectX SDK (December 2005)\Lib

vs2008下directshow的配置

  3. 新建一基于对话框的MFC程序DirectShowEx,建成后点项目->属性->连接器 ->命令行,在附加选项中输入strmbasd.lib

vs2008下directshow的配置

  4.在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。

原创粉丝点击