amcap这个实例不错,尤其是摄像头各种参数的调整,小弟看着不错,想在上面加个截图程序,响应回车截图.想用ISampleGrabberCB,IVMRWindowlessControl9,都没加上去,望那位大侠详细指点一下,万分感激!!

解决方案 »

  1.   

    ISampleGrabberCB为什么没加上去?它需要继承类实现指定的虚函数,设置正确的媒体类型,其实使用trans filter来的还快些
      

  2.   

    请您说的详细一点,小弟刚刚接触directshow,一点不懂,所以不会用,如果您能给出代码也可以,立即给分的!
    [email protected]
      

  3.   

    我用IBasicVieo里面的GetCurrentImage抓图,普通的摄像头rgb24的可以保存了,可是YUY2的摄像头能得到宽高,大小,就是不能得到size,哪位大侠能指点一下啊!!!!!!!!!!!!!!!!!!
      

  4.   

    没人解决么?小弟痛哭....发现vidcap32也就是platformsdk这个能抓帧,大家都在说stillcapture,grabbitmap等等的实例,我尝试了又尝试,通宵3天没干出来,我承认很笨,可是高手也吝啬不肯指点么?
      

  5.   

    看到你说ISampleGrabberCB没加上,说了它是要继承子类,实现部分函数,就可以了,至于要实现哪几个,你看看文档的说明,写的很清楚的,再有ds有它对应的filter,可以直接用
      

  6.   

    首先响应空格:
    IMediaControl *pMC = NULL;

    HRESULT hr = gcap.pFg->QueryInterface(IID_IMediaControl, (void **)&pMC);
    hr = pMC->Pause();
    pMC->Release();
    然后响应回车:
    HRESULT hr = gcap.pFg->QueryInterface(IID_IBasicVideo,(LPVOID *)&pBasicVideo);
    long height, width,bufSize;
    long* imgData;
    if(SUCCEEDED(hr))
    {
    //hr = pMC->Pause();
    if(FAILED(hr))
    {
    // stop parts that ran
    //pMC->Stop();
    }
    pBasicVideo->get_VideoHeight(&height);
    pBasicVideo->get_VideoWidth(&width);
    /*
    The second value is NULL to resolve required buffer size.
    The required buffer size will be returned in variable "bufSize".
    */
    hr = pBasicVideo->GetCurrentImage(&bufSize, 0);
    if (FAILED(hr)) 
    {
    ErrMsg("GetCurrentImage failed\n");
    return 1;
    }
    if (bufSize < 1) 
    {
    ErrMsg("failed to get data size\n");
    return 1;
    }
    imgData = new long[bufSize];
    // The data will be in DIB format
    hr = pBasicVideo->GetCurrentImage(&bufSize,(long*)imgData);
    if(FAILED(hr))
    {
    ErrMsg(TEXT("Error %x: C"), hr);
    return E_FAIL;
    }
    IMediaControl *pMC = NULL;
    hr = gcap.pFg->QueryInterface(IID_IMediaControl, (void **)&pMC);
    hr = pMC->Run();
    pMC->Release();
    }
    if(FAILED(hr))
    {
    ErrMsg(TEXT("Error %x: Cannot run preview graph"), hr);
    return FALSE;
    }
    ////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
    // save DIB file as Bitmap.
    // This sample saves image as bitmap to help
    // understanding the sample.
    HANDLE fh;
    BITMAPFILEHEADER bmphdr;
    BITMAPINFOHEADER bmpinfo;
    DWORD nWritten;
    memset(&bmphdr, 0, sizeof(bmphdr));
    memset(&bmpinfo, 0, sizeof(bmpinfo));
    bmphdr.bfType = ('M' << 8) | 'B';
    bmphdr.bfSize = sizeof(bmphdr) + sizeof(bmpinfo) + bufSize;
    bmphdr.bfOffBits = sizeof(bmphdr) + sizeof(bmpinfo);
    bmpinfo.biSize = sizeof(bmpinfo);
    bmpinfo.biWidth = width;
    bmpinfo.biHeight = height;
    bmpinfo.biPlanes = 1;
    bmpinfo.biBitCount = 24;
    fh = CreateFile("C:\\result.bmp",
    GENERIC_WRITE, 0, NULL,
    CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    WriteFile(fh, &bmphdr, sizeof(bmphdr), &nWritten, NULL);
    WriteFile(fh, &bmpinfo, sizeof(bmpinfo), &nWritten, NULL);
    WriteFile(fh, imgData, bufSize, &nWritten, NULL);
    CloseHandle(fh);
    对于普通RGB24的摄像头抓图成功,可是我的摄像头是YUY2的,抓图能得到高宽,大小,就是得不到imgData,汗....
      

  7.   

    就是说hr = pBasicVideo->GetCurrentImage(&bufSize,(long*)imgData);这句执行失败了是吧,这里bufSize大小正确吗?返回的hr是多少?
      

  8.   

     最好自己找个专门处理截图的filter。  就是在解码之后的。不用你搞的这么复杂。现在多媒体处理中有好多这样的filter。
      

  9.   

    hr = E_FAIL
    bufSize的大小第一次执行已经得到了!
      

  10.   

    Pause之后GetState等待Pause完成再继续。
    然后就是GetCurrentImage的第一次调用成功了没?
      

  11.   

    hr = E_FAIL
    bufSize的大小第一次执行已经得到了!这是第一次调用GetCurrentImage的返回值还是第二次?
      

  12.   

    Pause之后GetState等待Pause完成再继续。先试试这样,看看第二次能不能返回成功。
      

  13.   

    确认Pause已经完成,因为Pause响应的回车,我用普通摄像头遇到过这个问题,为了方便我直接响应两个按键,所以Pause确认已经完成!
      

  14.   

    能够确定是Pause的话。
    那么你用的是什么Renderer?
      

  15.   

    hr = gcap.pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,
                                                 &MEDIATYPE_Video, gcap.pVCap, NULL, NULL);
    是这个么?返回值为262782
      

  16.   

    不是,我是说你的渲染器如果没有使用VMR的话,GetCurrentImage可能会失败。加入一个InPlace的Filter,用来做图像保存的工作,比如Sample Grabber Filter。(当然你前面提到了ISampleGrabberCB,那个东西是ISampleGrabber设置的回调。而你需要先在graph中加入Sample Grabber Filter,才能查询ISampleGrabber接口。)这种方法会更值得信赖一些。