Can't make IAMStreamConfig.SetFormat() to work with LifeCam Studio

Ste*_*e K 5 directshow directshow.net

I'm brand new to DirectShow and am working on adding a video stream to my application. I've looked into many solutions out there (TouchLess, DirectShow.net, etc.) and ended up going with this small project on Code Project There isn't much to it, which is why I selected it; I wanted a small code base to work with, as I need to get this feature implemented quickly.

经过一整天的阅读,实验和调试,我终于让一切都运转良好.有一个延迟,这是一个无赖,但我可以稍后担心.我现在的问题是相机能够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);
}
Run Code Online (Sandbox Code Playgroud)

[更新]添加了下面的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;
}
Run Code Online (Sandbox Code Playgroud)

这几乎是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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我逐步完成了代码并验证了对SetFormat()的调用是否已执行并返回有效的HRESULT.但是对捕获的帧没有任何改变.

With no error messages it's difficult to know where to start. I'm hoping there are some DirectShow experts here that will see the problem, I'd even be happy with a good ol' fashion condescending "Well yeah, how do you expect the camera to change frame size once the buffer is allocated on the filter stack and the widget is initialized to the foobar! Pft... lol" ;)

Teach me, oh DirectShow/COM god!

[UPDATE #2] (FYI, it's odd that we can't just add a new message to this system and need to edit the original like this)

根据罗马的建议,我使用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
Run Code Online (Sandbox Code Playgroud)

[更新#3] - 神圣的COW,我开始了什么?!在我遇到支持罗马不匹配色彩空间理论的东西之前,为什么谷歌搜索比我用Google搜索更深入.我下载了应用程序并立即修复了一个太小的缓冲区错误.解决之后,我能够生成以下报告:

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
Run Code Online (Sandbox Code Playgroud)

Rom*_* R. 3

您将其放在正确的位置 - 在通过 AddFilter 将其放入图表中之后,但在连接其输出引脚之前。如果您成功获得了 HRESULT,那么您可能会期望格式发生变化,但可能会有例外,例如下游过滤器不接受此媒体类型,并且它们从一开始就开始协商。

您没有在此处显示您的ConfigureSampleGrabber,因此可能会出现这样的情况:您想要的这种媒体类型不被样本采集器接受,制作过滤器图表以尝试替代媒体类型和/或中间过滤器(例如解码器)。

您实际上可以做一些事情。

  1. 为了进行故障排除,您可能需要:

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

希望这可以帮助。