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;
}
所有代码都在上面了,实在不知道哪出错了导致不能运行,摆脱各位了

解决方案 »

  1.   

    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;
    }
    你看下,我改的