以前用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~~~