无法使IAMStreamConfig.SetFormat()与LifeCam Studio一起使用

时间:2011-09-12 04:37:32

标签: directshow directshow.net

我是DirectShow的新手,正在努力为我的应用添加视频流。我已经研究了很多解决方案(TouchLess,DirectShow.net等)并最终使用了这个small project on Code Project没有多少,这就是我选择它的原因;我想要一个小代码库,因为我需要快速实现这个功能。

经过一整天的阅读,实验和调试,我终于让一切都运转良好。有一个延迟,这是一个无赖,但我可以稍后担心。我此时遇到的问题是the camera is capable of 1280X720我希望使用此解决方案。然而,似乎决定以640x480捕获。当我越来越深入地学习如何设置分辨率时,我终于认为我已经弄明白了。我还在我用作基础的评论中的代码项目页面上找到了代码。

经过6个小时的尝试,我无法让这台相机改变它的分辨率。我没有收到任何错误,并且从SetFormat()返回的HRESULT为0,但相机不会改变分辨率。

要粘贴所有内容的代码太多了,但我希望包含构建图形的部分,因为我认为这就是问题所在。

以下是设置图表的代码

void CameraMethods::StartCamera(int camIndex, interior_ptr<int> width, 
    interior_ptr<int> height)
{
    if (g_pGraphBuilder != NULL)
        throw gcnew ArgumentException("Graph Builder was null");

    IMoniker *pMoniker = GetMoniker(camIndex);
    pMoniker->AddRef();

    HRESULT hr = S_OK;

    // Build all the necessary interfaces to start the capture
    if (SUCCEEDED(hr))
    {
        hr = CoCreateInstance(CLSID_FilterGraph,
            NULL,
            CLSCTX_INPROC,
            IID_IGraphBuilder,
            (LPVOID*)&g_pGraphBuilder);
    }

    if (SUCCEEDED(hr))
        hr = g_pGraphBuilder->QueryInterface(IID_IMediaControl, (LPVOID*)&g_pMediaControl);

    if (SUCCEEDED(hr))
    {
        hr = CoCreateInstance(CLSID_CaptureGraphBuilder2,
            NULL,
            CLSCTX_INPROC,
            IID_ICaptureGraphBuilder2,
            (LPVOID*)&g_pCaptureGraphBuilder);
    }

    // Setup the filter graph
    if (SUCCEEDED(hr))
        hr = g_pCaptureGraphBuilder->SetFiltergraph(g_pGraphBuilder);

    // Build the camera from the moniker
    if (SUCCEEDED(hr))
        hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (LPVOID*)&g_pIBaseFilterCam);

    // Add the camera to the filter graph
    if (SUCCEEDED(hr))
        hr = g_pGraphBuilder->AddFilter(g_pIBaseFilterCam, L"WebCam");

    // Create a SampleGrabber
    if (SUCCEEDED(hr))
        hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, 
            (void**)&g_pIBaseFilterSampleGrabber);

    // Configure the Sample Grabber
    if (SUCCEEDED(hr))
        hr = ConfigureSampleGrabber(g_pIBaseFilterSampleGrabber);

    //  Set the resolution - I have NO idea where this should be executed
    SetCaptureFormat(camIndex, *width, *height);

    // Add Sample Grabber to the filter graph
    if (SUCCEEDED(hr))
        hr = g_pGraphBuilder->AddFilter(g_pIBaseFilterSampleGrabber, L"SampleGrabber");

    // Create the NullRender
    if (SUCCEEDED(hr))
        hr = CoCreateInstance(CLSID_NullRenderer, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, 
            (void**)&g_pIBaseFilterNullRenderer);

    // Add the Null Render to the filter graph
    if (SUCCEEDED(hr))
        hr = g_pGraphBuilder->AddFilter(g_pIBaseFilterNullRenderer, L"NullRenderer");

    // Configure the render stream
    if (SUCCEEDED(hr))
        hr = g_pCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, 
            g_pIBaseFilterCam, g_pIBaseFilterSampleGrabber, g_pIBaseFilterNullRenderer);

    // Grab the capture width and height
    if (SUCCEEDED(hr))
    {
        ISampleGrabber* pGrabber = NULL;
        hr = g_pIBaseFilterSampleGrabber->QueryInterface(IID_ISampleGrabber, (LPVOID*)&pGrabber);
        if (SUCCEEDED(hr))
        {
            AM_MEDIA_TYPE mt;
            hr = pGrabber->GetConnectedMediaType(&mt);
            if (SUCCEEDED(hr))
            {
                VIDEOINFOHEADER *pVih;
                if ((mt.formattype == FORMAT_VideoInfo) &&
                    (mt.cbFormat >= sizeof(VIDEOINFOHEADER)) &&
                    (mt.pbFormat != NULL) )
                {
                    pVih = (VIDEOINFOHEADER*)mt.pbFormat;
                    *width = pVih->bmiHeader.biWidth;
                    *height = pVih->bmiHeader.biHeight;
                }
                else
                {
                    hr = E_FAIL;  // Wrong format
                }

                // FreeMediaType(mt); (from MSDN)
                if (mt.cbFormat != 0)
                {
                    CoTaskMemFree((PVOID)mt.pbFormat);
                    mt.cbFormat = 0;
                    mt.pbFormat = NULL;
                }
                if (mt.pUnk != NULL)
                {
                    // Unecessary because pUnk should not be used, but safest.
                    mt.pUnk->Release();
                    mt.pUnk = NULL;
                }
            }
        }

        if (pGrabber != NULL)
        {
            pGrabber->Release();
            pGrabber = NULL;
        }
    }

    // Start the capture
    if (SUCCEEDED(hr))
        hr = g_pMediaControl->Run();

    // If init fails then ensure that you cleanup
    if (FAILED(hr))
        StopCamera();
    else
        hr = S_OK;  // Make sure we return S_OK for success

    // Cleanup
    if (pMoniker != NULL)
    {
        pMoniker->Release();
        pMoniker = NULL;
    }

    if (SUCCEEDED(hr))
        this->activeCameraIndex = camIndex;
    else
        throw gcnew COMException("Error Starting Camera", hr);
}

[UPDATE]添加了下面的ConfigureSampleGrabber()方法

HRESULT CameraMethods::ConfigureSampleGrabber(IBaseFilter *pIBaseFilter)
{
    HRESULT hr = S_OK;
    ISampleGrabber *pGrabber = NULL;

    hr = pIBaseFilter->QueryInterface(IID_ISampleGrabber, (void**)&pGrabber);
    if (SUCCEEDED(hr))
    {
        AM_MEDIA_TYPE mt;
        ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
        mt.majortype = MEDIATYPE_Video;
        mt.subtype = MEDIASUBTYPE_RGB24;
        mt.formattype = FORMAT_VideoInfo;
        hr = pGrabber->SetMediaType(&mt);
    }

    if (SUCCEEDED(hr))
        hr = pGrabber->SetCallback(new SampleGrabberCB(), 1);

    if (pGrabber != NULL)
    {
        pGrabber->Release();
        pGrabber = NULL;
    }

    return hr;
}

这几乎是CodeProject源代码中的确切代码。然后我添加了这个方法来设置分辨率:

void CameraMethods::SetCaptureFormat(int camIndex, int width, int height)
{
    HRESULT hr = S_OK;
    IMoniker* pMoniker = GetMoniker(camIndex);

    IBaseFilter* pCap;
    hr=pMoniker->BindToObject(0,0,IID_IBaseFilter,(void **)&pCap);

    if(!SUCCEEDED(hr))
        return;

    IAMStreamConfig *pConfig = NULL;

    if(g_pCaptureGraphBuilder == NULL)  // no CaptureGraphBuilder initialised
        return;

    hr = g_pCaptureGraphBuilder->FindInterface(
        &PIN_CATEGORY_CAPTURE, // Preview pin.
        0,    // Any media type.
        pCap, // Pointer to the capture filter.
        IID_IAMStreamConfig, (void**)&pConfig);

    if(!SUCCEEDED(hr))
        return;

    int iCount = 0, iSize = 0;
    hr = pConfig->GetNumberOfCapabilities(&iCount, &iSize);

    // Check the size to make sure we pass in the correct structure.
    if (iSize == sizeof(VIDEO_STREAM_CONFIG_CAPS)) {

        // Use the video capabilities structure.
        for (int iFormat = 0; iFormat < iCount; iFormat++)
        {
            VIDEO_STREAM_CONFIG_CAPS scc;
            AM_MEDIA_TYPE *pmt;
            /* Note:  Use of the VIDEO_STREAM_CONFIG_CAPS structure to configure a video device is 
            deprecated. Although the caller must allocate the buffer, it should ignore the 
            contents after the method returns. The capture device will return its supported 
            formats through the pmt parameter. */
            hr = pConfig->GetStreamCaps(iFormat, &pmt, (BYTE*)&scc);
            if (SUCCEEDED(hr))
            {
                /* Examine the format, and possibly use it. */
                if (pmt->formattype == FORMAT_VideoInfo) {
                    // Check the buffer size.
                    if (pmt->cbFormat >= sizeof(VIDEOINFOHEADER))
                    {
                        VIDEOINFOHEADER *pVih =  reinterpret_cast<VIDEOINFOHEADER*>(pmt->pbFormat);
                        BITMAPINFOHEADER *bmiHeader = &pVih->bmiHeader;

                        /* Access VIDEOINFOHEADER members through pVih. */
                        if( bmiHeader->biWidth == width && bmiHeader->biHeight == height && 
                            bmiHeader->biBitCount == 24)
                        {
                            hr = pConfig->SetFormat(pmt);
                        }
                    }
                }

                // Delete the media type when you are done.
                DeleteMediaType(pmt);
            }
        }
    }
}

我已经完成了代码并验证了对SetFormat()的调用是否已执行并返回有效的HRESULT。尽管如此,对捕获的帧没有任何更改。

没有错误消息,很难知道从哪里开始。我希望这里有一些DirectShow专家可以看到这个问题,我甚至会对一个很好的'时尚居高临下'感到高兴。嗯,是的,一旦缓冲区分配给你,你怎么期望相机改变帧大小过滤器堆栈和小部件初始化为foobar!Pft ... lol“;)

教我,哦DirectShow / COM上帝!

[更新#2](仅供参考,我们不能在此系统中添加新消息并需要像这样编辑原始内容,这很奇怪)

Per Roman的建议我使用GraphStudio来查看我的图表。我承认我仍然不明白我在看什么。我发现了一个“文本报告”功能,并认为如果它显示一些有价值的信息,在此发布该报告会很有帮助。

--------------------------------------------------
  Filters
--------------------------------------------------
  1. Smart Tee
  2. MJPEG Decompressor
  3. SampleGrabber
  4. NullRenderer
  5. WebCam

--------------------------------------------------
  Connections
--------------------------------------------------
  1. [Smart Tee]/(Capture) -> [MJPEG Decompressor]/(XForm In)
      Major:   MEDIATYPE_Video
      Subtype: MEDIASUBTYPE_MJPG
          bFixedSizeSamples:    TRUE
          bTemporalCompression: FALSE
          lSampleSize:          921600
          cbFormat:             88
      Format:  FORMAT_VideoInfo
      VIDEOINFOHEADER:
          rcSource:             (0,0,0,0)
          rcTarget:             (0,0,0,0)
          dwBitRate:            221184000
          dwBitErrorRate:       0
          AvgTimePerFrame:      333333
      BITMAPINFOHEADER:
          biSize:               40
          biWidth:              640
          biHeight:             480
          biPlanes:             1
          biBitCount:           24
          biCompression:        0x47504A4D
          biSizeImage:          921600
          biXPelsPerMeter:      0
          biYPelsPerMeter:      0
          biClrUsed:            0
          biClrImportant:       0

  2. [MJPEG Decompressor]/(XForm Out) -> [SampleGrabber]/(Input)
      Major:   MEDIATYPE_Video
      Subtype: MEDIASUBTYPE_RGB24
          bFixedSizeSamples:    TRUE
          bTemporalCompression: FALSE
          lSampleSize:          921600
          cbFormat:             88
      Format:  FORMAT_VideoInfo
      VIDEOINFOHEADER:
          rcSource:             (0,0,0,0)
          rcTarget:             (0,0,0,0)
          dwBitRate:            221184221
          dwBitErrorRate:       0
          AvgTimePerFrame:      333333
      BITMAPINFOHEADER:
          biSize:               40
          biWidth:              640
          biHeight:             480
          biPlanes:             1
          biBitCount:           24
          biCompression:        0x00000000
          biSizeImage:          921600
          biXPelsPerMeter:      0
          biYPelsPerMeter:      0
          biClrUsed:            0
          biClrImportant:       0

  3. [SampleGrabber]/(Output) -> [NullRenderer]/(In)
      Major:   MEDIATYPE_Video
      Subtype: MEDIASUBTYPE_RGB24
          bFixedSizeSamples:    TRUE
          bTemporalCompression: FALSE
          lSampleSize:          921600
          cbFormat:             88
      Format:  FORMAT_VideoInfo
      VIDEOINFOHEADER:
          rcSource:             (0,0,0,0)
          rcTarget:             (0,0,0,0)
          dwBitRate:            221184221
          dwBitErrorRate:       0
          AvgTimePerFrame:      333333
      BITMAPINFOHEADER:
          biSize:               40
          biWidth:              640
          biHeight:             480
          biPlanes:             1
          biBitCount:           24
          biCompression:        0x00000000
          biSizeImage:          921600
          biXPelsPerMeter:      0
          biYPelsPerMeter:      0
          biClrUsed:            0
          biClrImportant:       0

  4. [WebCam]/(Capture) -> [Smart Tee]/(Input)
      Major:   MEDIATYPE_Video
      Subtype: MEDIASUBTYPE_MJPG
          bFixedSizeSamples:    TRUE
          bTemporalCompression: FALSE
          lSampleSize:          921600
          cbFormat:             88
      Format:  FORMAT_VideoInfo
      VIDEOINFOHEADER:
          rcSource:             (0,0,0,0)
          rcTarget:             (0,0,0,0)
          dwBitRate:            221184000
          dwBitErrorRate:       0
          AvgTimePerFrame:      333333
      BITMAPINFOHEADER:
          biSize:               40
          biWidth:              640
          biHeight:             480
          biPlanes:             1
          biBitCount:           24
          biCompression:        0x47504A4D
          biSizeImage:          921600
          biXPelsPerMeter:      0
          biYPelsPerMeter:      0
          biClrUsed:            0
          biClrImportant:       0

[更新#3] - 神圣的COW,我开始了什么?! 为什么谷歌搜索比我之前搜索过的更深刻?came across something that supports罗马的色彩空间不匹配理论。我downloaded the app并且马上必须修复一个太小的缓冲区。解决之后,我能够生成以下报告:

Dump Version:   1.2

Using device:   Microsoft® LifeCam Studio(TM)
Interface:  USB

Pin Name:   Capture
Pin direction:  Output
Pin category:   Capture

IAMVideoCompression:    No
ISpecifyPropertyPages:  Yes
IMediaSeeking:  Yes
IPinConnection: No
IPinFlowControl:    No
IAMDroppedFrames:   No
IAMVideoProcAmp:    No
IAMVideoControlCaps:    0

Major Type  Sub Type    Format Type FixedSamples    Temporal Compression    Sample Size Max Input Size  Min Output Size Max Output Size Min-Max FPS Video Standard
Video   YUY2    VideoInfo   Fixed   NotTemporal 614400  640x480 640x480 640x480 7.50-30.00  {none}
Video   YUY2    VideoInfo2  Fixed   NotTemporal 614400  640x480 640x480 640x480 7.50-30.00  {none}
Video   YUY2    VideoInfo   Fixed   NotTemporal 1843200 1280x720    1280x720    1280x720    7.50-10.00  {none}
Video   YUY2    VideoInfo2  Fixed   NotTemporal 1843200 1280x720    1280x720    1280x720    7.50-10.00  {none}
Video   YUY2    VideoInfo   Fixed   NotTemporal 1044480 960x544 960x544 960x544 7.50-20.00  {none}
Video   YUY2    VideoInfo2  Fixed   NotTemporal 1044480 960x544 960x544 960x544 7.50-20.00  {none}
Video   YUY2    VideoInfo   Fixed   NotTemporal 716800  800x448 800x448 800x448 7.50-30.00  {none}
Video   YUY2    VideoInfo2  Fixed   NotTemporal 716800  800x448 800x448 800x448 7.50-30.00  {none}
Video   YUY2    VideoInfo   Fixed   NotTemporal 460800  640x360 640x360 640x360 7.50-30.00  {none}
Video   YUY2    VideoInfo2  Fixed   NotTemporal 460800  640x360 640x360 640x360 7.50-30.00  {none}
Video   YUY2    VideoInfo   Fixed   NotTemporal 203520  424x240 424x240 424x240 7.50-30.00  {none}
Video   YUY2    VideoInfo2  Fixed   NotTemporal 203520  424x240 424x240 424x240 7.50-30.00  {none}
Video   YUY2    VideoInfo   Fixed   NotTemporal 202752  352x288 352x288 352x288 7.50-30.00  {none}
Video   YUY2    VideoInfo2  Fixed   NotTemporal 202752  352x288 352x288 352x288 7.50-30.00  {none}
Video   YUY2    VideoInfo   Fixed   NotTemporal 153600  320x240 320x240 320x240 7.50-30.00  {none}
Video   YUY2    VideoInfo2  Fixed   NotTemporal 153600  320x240 320x240 320x240 7.50-30.00  {none}
Video   YUY2    VideoInfo   Fixed   NotTemporal 960000  800x600 800x600 800x600 7.50-20.00  {none}
Video   YUY2    VideoInfo2  Fixed   NotTemporal 960000  800x600 800x600 800x600 7.50-20.00  {none}
Video   YUY2    VideoInfo   Fixed   NotTemporal 50688   176x144 176x144 176x144 7.50-30.00  {none}
Video   YUY2    VideoInfo2  Fixed   NotTemporal 50688   176x144 176x144 176x144 7.50-30.00  {none}
Video   YUY2    VideoInfo   Fixed   NotTemporal 38400   160x120 160x120 160x120 7.50-30.00  {none}
Video   YUY2    VideoInfo2  Fixed   NotTemporal 38400   160x120 160x120 160x120 7.50-30.00  {none}
Video   YUY2    VideoInfo   Fixed   NotTemporal 4147200 1920x1080   1920x1080   1920x1080   5.00-5.00   {none}
Video   YUY2    VideoInfo2  Fixed   NotTemporal 4147200 1920x1080   1920x1080   1920x1080   5.00-5.00   {none}
Video   MJPG    VideoInfo   Fixed   NotTemporal 921600  640x480 640x480 640x480 7.50-30.00  {none}
Video   MJPG    VideoInfo2  Fixed   NotTemporal 921600  640x480 640x480 640x480 7.50-30.00  {none}
Video   MJPG    VideoInfo   Fixed   NotTemporal 6220800 1920x1080   1920x1080   1920x1080   7.50-30.00  {none}
Video   MJPG    VideoInfo2  Fixed   NotTemporal 6220800 1920x1080   1920x1080   1920x1080   7.50-30.00  {none}
Video   MJPG    VideoInfo   Fixed   NotTemporal 2764800 1280x720    1280x720    1280x720    7.50-30.00  {none}
Video   MJPG    VideoInfo2  Fixed   NotTemporal 2764800 1280x720    1280x720    1280x720    7.50-30.00  {none}
Video   MJPG    VideoInfo   Fixed   NotTemporal 1566720 960x544 960x544 960x544 7.50-30.00  {none}
Video   MJPG    VideoInfo2  Fixed   NotTemporal 1566720 960x544 960x544 960x544 7.50-30.00  {none}
Video   MJPG    VideoInfo   Fixed   NotTemporal 1075200 800x448 800x448 800x448 7.50-30.00  {none}
Video   MJPG    VideoInfo2  Fixed   NotTemporal 1075200 800x448 800x448 800x448 7.50-30.00  {none}
Video   MJPG    VideoInfo   Fixed   NotTemporal 691200  640x360 640x360 640x360 7.50-30.00  {none}
Video   MJPG    VideoInfo2  Fixed   NotTemporal 691200  640x360 640x360 640x360 7.50-30.00  {none}
Video   MJPG    VideoInfo   Fixed   NotTemporal 1440000 800x600 800x600 800x600 7.50-30.00  {none}
Video   MJPG    VideoInfo2  Fixed   NotTemporal 1440000 800x600 800x600 800x600 7.50-30.00  {none}
Video   MJPG    VideoInfo   Fixed   NotTemporal 311040  432x240 432x240 432x240 7.50-30.00  {none}
Video   MJPG    VideoInfo2  Fixed   NotTemporal 311040  432x240 432x240 432x240 7.50-30.00  {none}
Video   MJPG    VideoInfo   Fixed   NotTemporal 304128  352x288 352x288 352x288 7.50-30.00  {none}
Video   MJPG    VideoInfo2  Fixed   NotTemporal 304128  352x288 352x288 352x288 7.50-30.00  {none}
Video   MJPG    VideoInfo   Fixed   NotTemporal 76032   176x144 176x144 176x144 7.50-30.00  {none}
Video   MJPG    VideoInfo2  Fixed   NotTemporal 76032   176x144 176x144 176x144 7.50-30.00  {none}
Video   MJPG    VideoInfo   Fixed   NotTemporal 230400  320x240 320x240 320x240 7.50-30.00  {none}
Video   MJPG    VideoInfo2  Fixed   NotTemporal 230400  320x240 320x240 320x240 7.50-30.00  {none}
Video   MJPG    VideoInfo   Fixed   NotTemporal 57600   160x120 160x120 160x120 7.50-30.00  {none}
Video   MJPG    VideoInfo2  Fixed   NotTemporal 57600   160x120 160x120 160x120 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo   Fixed   NotTemporal 460800  640x480 640x480 640x480 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo2  Fixed   NotTemporal 460800  640x480 640x480 640x480 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo   Fixed   NotTemporal 1382400 1280x720    1280x720    1280x720    7.50-15.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo2  Fixed   NotTemporal 1382400 1280x720    1280x720    1280x720    7.50-15.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo   Fixed   NotTemporal 783360  960x544 960x544 960x544 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo2  Fixed   NotTemporal 783360  960x544 960x544 960x544 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo   Fixed   NotTemporal 537600  800x448 800x448 800x448 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo2  Fixed   NotTemporal 537600  800x448 800x448 800x448 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo   Fixed   NotTemporal 345600  640x360 640x360 640x360 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo2  Fixed   NotTemporal 345600  640x360 640x360 640x360 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo   Fixed   NotTemporal 152640  424x240 424x240 424x240 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo2  Fixed   NotTemporal 152640  424x240 424x240 424x240 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo   Fixed   NotTemporal 152064  352x288 352x288 352x288 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo2  Fixed   NotTemporal 152064  352x288 352x288 352x288 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo   Fixed   NotTemporal 115200  320x240 320x240 320x240 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo2  Fixed   NotTemporal 115200  320x240 320x240 320x240 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo   Fixed   NotTemporal 720000  800x600 800x600 800x600 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo2  Fixed   NotTemporal 720000  800x600 800x600 800x600 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo   Fixed   NotTemporal 38016   176x144 176x144 176x144 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo2  Fixed   NotTemporal 38016   176x144 176x144 176x144 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo   Fixed   NotTemporal 28800   160x120 160x120 160x120 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo2  Fixed   NotTemporal 28800   160x120 160x120 160x120 7.50-30.00  {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo   Fixed   NotTemporal 3110400 1920x1080   1920x1080   1920x1080   7.50-7.50   {none}
Video   {3032344D-0000-0010-8000-00AA00389B71}  VideoInfo2  Fixed   NotTemporal 3110400 1920x1080   1920x1080   1920x1080   7.50-7.50   {none}

Pin Name:   Video Camera Terminal
Pin direction:  Input
Pin category:   {3EBC7959-3310-493B-AA81-C7E132D56F71}

IAMVideoCompression:    No
ISpecifyPropertyPages:  Yes
IMediaSeeking:  No
IPinConnection: No
IPinFlowControl:    No
IAMDroppedFrames:   No
IAMVideoProcAmp:    No
IAMVideoControlCaps:    0

Major Type  Sub Type    Format Type FixedSamples    Temporal Compression    Sample Size

2 个答案:

答案 0 :(得分:3)

你将它放在正确的位置 - 在它已经在AddFilter的图形中之后,但是在其输出引脚连接之前。如果您有成功的HRESULT,那么您可能期望更改格式,但可能有例外,例如下游过滤器不接受此媒体类型,并且他们从一开始就开始协商。

您未在此处显示您的ConfigureSampleGrabber,因此样本抓取器不会接受您想要的此媒体类型,从而尝试使用过滤器图形来尝试备用媒体类型和/或中间过滤器(例如解码器)。 / p>

您可以实际执行一些操作。

  1. 要进行疑难解答,您可能需要:

    1. add the filter graph to ROT,或者只是install DirectShow Spy自动完成相同的操作
    2. 在您的SetCaptureFormat
    3. 之后立即在代码中添加MessageBox
    4. 当消息框仍在屏幕上时,使用GraphEdit(GraphStudio)检查过滤器图形并查看它在其输出引脚上枚举的媒体类型;通常第一种媒体类型将是用于实际连接的媒体类型,因此您在SetFormat中成功的HRESULT基本上假设媒体类型现在位于此列表之上
  2. 要强制使用媒体类型,您可能需要将IFilterGraph :: ConnectDirect与已配置的引脚一起使用,它是您感兴趣的直接邻居下游引脚和媒体类型。

  3. 希望这有帮助。

答案 1 :(得分:0)

史蒂夫,你不应该在SetCaptureFormat重建相机(来自绰号),而是使用g_pIBaseFilterCam