RT,编译没有错,但是就是运行后没有图像,不知道为什么,好纠结啊,本来是用VFW做的,但是现在VFW刷新率什么的很多问题,还有不支持1394采集卡,不得已就换了DS,初学这个,头都大了,什么filter和filter graph都是一知半解,但是还是硬着头皮写了个预览的,结果打击死了,麻烦各位大大帮帮我,谢谢了。
class CPreviewDlg : public CDialog
{
// Construction
public:
CPreviewDlg(CWnd* pParent = NULL); // standard constructor IMediaControl *pMediaControl ; //媒体控制
IGraphBuilder *pGraph; //过滤图表
IBaseFilter *pSrc,*pPreview; //过滤器
IMoniker *pMoniker; //监视器 IPin* FindPin(IBaseFilter *pFilter, PIN_DIRECTION dir);
[
BOOL CPreviewDlg::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
ICaptureGraphBuilder2 * pBuilder = NULL;
pGraph = NULL;
pMediaControl = NULL;
//枚举视频设备
ICreateDevEnum *pDevEnum = NULL;
CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void **)&pDevEnum);
IEnumMoniker *pClassEnum = NULL; pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
ULONG cFetched;
if (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);
pMoniker->Release();
}
pClassEnum->Release(); CoCreateInstance(CLSID_CaptureGraphBuilder2,0,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(void**)&pBuilder);
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph); pBuilder->SetFiltergraph(pGraph);
pGraph->QueryInterface(IID_IMediaControl,(void**)&pMediaControl);
pGraph->AddFilter(pSrc,L"avi"); pPreview = NULL; CoCreateInstance(CLSID_VideoRenderer,0,CLSCTX_ALL,IID_IBaseFilter,(void**)&pPreview);
if (pPreview != NULL)
{
pGraph->AddFilter(pPreview,L"preview");
//连接引脚
IPin * pSourceOut;
pSourceOut = FindPin(pSrc,PINDIR_OUTPUT);
IPin* pPreIn = FindPin(pPreview,PINDIR_INPUT);
pGraph->ConnectDirect(pSourceOut,pPreIn,NULL); //获取预览窗口
IVideoWindow * pViewWnd= NULL;
pPreview->QueryInterface(IID_IVideoWindow,(void**)&pViewWnd);
if (pViewWnd)
{
//设置预览窗口的拥有者
pViewWnd->put_Owner((long)m_hWnd);
pViewWnd->put_Left(1);
pViewWnd->put_Top(1); //获取预览窗口风格
long style;
pViewWnd->get_WindowStyle(&style);
style = style & ~WS_CAPTION;
style = style & ~WS_DLGFRAME;
style = style & WS_CHILD;
pViewWnd->put_WindowStyle(style); //设置预览窗口宽度和高度
CWnd* pwnd = GetDlgItem(IDC_Video);
CRect rc;
pwnd->GetClientRect(&rc);
pViewWnd->put_Height(rc.Height()-60);
pViewWnd->put_Width(rc.Width()-2);
}
pMediaControl->Run();
}
return TRUE; // return TRUE unless you set the focus to a control
}
/code][code=C/C++]
//查找引脚
IPin* CPreviewDlg::FindPin(IBaseFilter *pFilter, PIN_DIRECTION dir)
{
IEnumPins* pEnumPins;
IPin* pOutpin;
PIN_DIRECTION pDir;
pFilter->EnumPins(&pEnumPins); while (pEnumPins->Next(1,&pOutpin,NULL)==S_OK)
{
pOutpin->QueryDirection(&pDir);
if (pDir==dir)
{
return pOutpin;
}
}
return 0;
}
所有代码都在上面了,实在不知道哪出错了导致不能运行,摆脱各位了
class CPreviewDlg : public CDialog
{
// Construction
public:
CPreviewDlg(CWnd* pParent = NULL); // standard constructor IMediaControl *pMediaControl ; //媒体控制
IGraphBuilder *pGraph; //过滤图表
IBaseFilter *pSrc,*pPreview; //过滤器
IMoniker *pMoniker; //监视器 IPin* FindPin(IBaseFilter *pFilter, PIN_DIRECTION dir);
[
BOOL CPreviewDlg::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
ICaptureGraphBuilder2 * pBuilder = NULL;
pGraph = NULL;
pMediaControl = NULL;
//枚举视频设备
ICreateDevEnum *pDevEnum = NULL;
CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void **)&pDevEnum);
IEnumMoniker *pClassEnum = NULL; pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
ULONG cFetched;
if (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);
pMoniker->Release();
}
pClassEnum->Release(); CoCreateInstance(CLSID_CaptureGraphBuilder2,0,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(void**)&pBuilder);
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph); pBuilder->SetFiltergraph(pGraph);
pGraph->QueryInterface(IID_IMediaControl,(void**)&pMediaControl);
pGraph->AddFilter(pSrc,L"avi"); pPreview = NULL; CoCreateInstance(CLSID_VideoRenderer,0,CLSCTX_ALL,IID_IBaseFilter,(void**)&pPreview);
if (pPreview != NULL)
{
pGraph->AddFilter(pPreview,L"preview");
//连接引脚
IPin * pSourceOut;
pSourceOut = FindPin(pSrc,PINDIR_OUTPUT);
IPin* pPreIn = FindPin(pPreview,PINDIR_INPUT);
pGraph->ConnectDirect(pSourceOut,pPreIn,NULL); //获取预览窗口
IVideoWindow * pViewWnd= NULL;
pPreview->QueryInterface(IID_IVideoWindow,(void**)&pViewWnd);
if (pViewWnd)
{
//设置预览窗口的拥有者
pViewWnd->put_Owner((long)m_hWnd);
pViewWnd->put_Left(1);
pViewWnd->put_Top(1); //获取预览窗口风格
long style;
pViewWnd->get_WindowStyle(&style);
style = style & ~WS_CAPTION;
style = style & ~WS_DLGFRAME;
style = style & WS_CHILD;
pViewWnd->put_WindowStyle(style); //设置预览窗口宽度和高度
CWnd* pwnd = GetDlgItem(IDC_Video);
CRect rc;
pwnd->GetClientRect(&rc);
pViewWnd->put_Height(rc.Height()-60);
pViewWnd->put_Width(rc.Width()-2);
}
pMediaControl->Run();
}
return TRUE; // return TRUE unless you set the focus to a control
}
/code][code=C/C++]
//查找引脚
IPin* CPreviewDlg::FindPin(IBaseFilter *pFilter, PIN_DIRECTION dir)
{
IEnumPins* pEnumPins;
IPin* pOutpin;
PIN_DIRECTION pDir;
pFilter->EnumPins(&pEnumPins); while (pEnumPins->Next(1,&pOutpin,NULL)==S_OK)
{
pOutpin->QueryDirection(&pDir);
if (pDir==dir)
{
return pOutpin;
}
}
return 0;
}
所有代码都在上面了,实在不知道哪出错了导致不能运行,摆脱各位了
{
// Construction
public:
CPreviewDlg(CWnd* pParent = NULL); // standard constructor IMediaControl *pMediaControl ; //媒体控制
IGraphBuilder *pGraph; //过滤图表
IBaseFilter *pSrc,*pPreview; //过滤器
IMoniker *pMoniker; //监视器 IPin* FindPin(IBaseFilter *pFilter, PIN_DIRECTION dir);[
BOOL CPreviewDlg::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
ICaptureGraphBuilder2 * pBuilder = NULL;
pGraph = NULL;
pMediaControl = NULL;
//枚举视频设备
ICreateDevEnum *pDevEnum = NULL;
CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void **)&pDevEnum);
IEnumMoniker *pClassEnum = NULL; pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
ULONG cFetched;
if (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);
pMoniker->Release();
}
pClassEnum->Release(); CoCreateInstance(CLSID_CaptureGraphBuilder2,0,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(void**)&pBuilder);
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph); pBuilder->SetFiltergraph(pGraph);
pGraph->QueryInterface(IID_IMediaControl,(void**)&pMediaControl);
pGraph->AddFilter(pSrc,L"avi"); pPreview = NULL; CoCreateInstance(CLSID_VideoRenderer,0,CLSCTX_ALL,IID_IBaseFilter,(void**)&pPreview);
if (pPreview != NULL)
{
pGraph->AddFilter(pPreview,L"preview");
//连接引脚
IPin * pSourceOut;
pSourceOut = FindPin(pSrc,PINDIR_OUTPUT);
IPin* pPreIn = FindPin(pPreview,PINDIR_INPUT);
pGraph->ConnectDirect(pSourceOut,pPreIn,NULL); //获取预览窗口
IVideoWindow * pViewWnd= NULL;
pPreview->QueryInterface(IID_IVideoWindow,(void**)&pViewWnd);
if (pViewWnd)
{
//设置预览窗口的拥有者
pViewWnd->put_Owner((long)m_hWnd);
pViewWnd->put_Left(1);
pViewWnd->put_Top(1); //获取预览窗口风格
long style;
pViewWnd->get_WindowStyle(&style);
style = style & ~WS_CAPTION;
style = style & ~WS_DLGFRAME;
style = style & WS_CHILD;
pViewWnd->put_WindowStyle(style); //设置预览窗口宽度和高度
CWnd* pwnd = GetDlgItem(IDC_Video);
CRect rc;
pwnd->GetClientRect(&rc);
pViewWnd->put_Height(rc.Height()-60);
pViewWnd->put_Width(rc.Width()-2);
}
pMediaControl->Run();
}
return TRUE; // return TRUE unless you set the focus to a control
}
/code][code=C/C++]
//查找引脚
IPin* CPreviewDlg::FindPin(IBaseFilter *pFilter, PIN_DIRECTION dir)
{
IEnumPins* pEnumPins;
IPin* pOutpin;
PIN_DIRECTION pDir;
pFilter->EnumPins(&pEnumPins); while (pEnumPins->Next(1,&pOutpin,NULL)==S_OK)
{
pOutpin->QueryDirection(&pDir);
if (pDir==dir)
{
return pOutpin;
}
}
return 0;
}
你看下,我改的