2011-09-12 9 views
5

Sono nuovo di zecca per DirectShow e sto lavorando per aggiungere un flusso video alla mia applicazione. Ho esaminato molte soluzioni là fuori (TouchLess, DirectShow.net, ecc.) E ho finito per andare con questo small project on Code Project Non c'è molto, ed è per questo che l'ho selezionato; Volevo una piccola base di codice con cui lavorare, poiché ho bisogno di implementare rapidamente questa funzionalità.Impossibile rendere IAMStreamConfig.SetFormat() compatibile con LifeCam Studio

Dopo una giornata piena di lettura, sperimentazione e debug, finalmente ho tutto a posto. C'è un ritardo che è un peccato, ma posso preoccuparmene dopo. Il problema che ho a questo punto è che the camera is capable of 1280X720 e voglio usare questa risoluzione. Tuttavia sembra determinato a catturare a 640x480. Mentre scavavo sempre più in profondità e approfondendo l'apprendimento della risoluzione, alla fine ho pensato di averlo capito. Ho anche trovato il codice su quella pagina di Code Project nei commenti che ho usato come base.

Dopo 6 ore di tentativi, non riesco a far cambiare la risoluzione della videocamera. Non ricevo errori e HRESULT restituito da SetFormat() è 0, tuttavia la fotocamera non cambierà la risoluzione.

C'è troppo codice per incollare tutto, ma vorrei includere la sezione che crea il grafico poiché immagino che sia il problema.

Qui è il codice che imposta il grafico

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] Inserito il metodo ConfigureSampleGrabber() sotto

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; 
} 

Questo è più o meno il codice esatto dalla sorgente CodeProject codice. Ho poi aggiunto questo metodo per impostare la risoluzione:

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); 
      } 
     } 
    } 
} 

ho fatto un passo attraverso il codice e verificato che viene eseguita la chiamata a SetFormat() e restituire un HRESULT valida. Nessuna modifica ai frame acquisiti.

Con nessun messaggio di errore è difficile sapere da dove iniziare. Spero che ci siano alcuni esperti di DirectShow qui che vedranno il problema, sarei persino contento di un buon vecchio stile accondiscendente. Beh, come ti aspetti che la videocamera cambi la dimensione del fotogramma una volta che il buffer è stato assegnato filtro stack e il widget è inizializzato per il foobar! Pft ... lol ";)

Insegnami, oh DirectShow/COM dio!

[UPDATE # 2] (FYI, è strano che non possiamo aggiungere un nuovo messaggio a questo sistema e la necessità di modificare l'originale come questo) suggerimento di

Per romana ho usato GraphStudio a guarda sotto il cofano del mio grafico. Devo ammettere che non capisco ancora cosa sto guardando esattamente. Ho trovato una funzione di "rapporto di testo" e ho pensato che sarebbe stato utile pubblicare questo rapporto nel caso in cui mostrasse alcune informazioni preziose.

-------------------------------------------------- 
    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 

[Aggiornamento n. 3] - Holy COW, che cosa ho iniziato ?! Perché cercare su Google più a fondo di quanto abbia mai cercato su Google prima di I came across something that supports La teoria di Roman di spazi di colore non corrispondenti. I downloaded the app e subito ho dovuto correggere un bug con un buffer troppo piccolo.Dopo aver risolto che ero in grado di generare il seguente rapporto:

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 

risposta

3

lo metti in posto giusto - dopo che è già nel grafico da AddFilter, ma ancora prima del suo pin di uscita è collegato. Se hai successo con HRESULT, allora potresti aspettarti il ​​formato modificato, ma potrebbero esserci delle eccezioni, come ad esempio questo tipo di media non è stato accettato dal filtro downstream e hanno iniziato a negoziare dall'inizio.

Qui non visualizzi il tuo ConfigureSampleGrabber, quindi potrebbe essere il caso che questo tipo di supporto non sia accettato dal grabber campione che fa il grafico del filtro per provare tipi di media alternativi e/o filtri intermedi (come i decodificatori).

Ci sono alcune cose che puoi effettivamente fare.

  1. Per la risoluzione dei problemi si potrebbe desiderare di:

    1. add the filter graph to ROT, o invece solo install DirectShow Spy per avere lo stesso fatto per voi automaticamente
    2. aggiungere un MessageBox nel codice subito dopo l'SetCaptureFormat
    3. mentre la finestra di messaggio è ancora sullo schermo, usa GraphEdit (GraphStudio) per ispezionare il tuo grafico del filtro e per vedere quali tipi di media enumera sul suo pin di uscita; in genere il primo tipo di supporto sarà quello utilizzato per la connessione vera e propria, in modo che il HRESULT successo in SetFormat assume sostanzialmente il tipo di supporto è ora in cima a questa lista
  2. Per forzare il tipo di supporto, si potrebbe desiderare di utilizzare IFilterGraph :: ConnectDirect con il pin configurato, è il pin downstream adiacente immediato e il tipo di media di tuo interesse.

Spero che questo aiuti.

+0

Ho aggiornato il post originale per includere il metodo ConfigureSampleGrabber(). Nel frattempo esaminerò le opzioni aggiuntive elencate. Grazie per la risposta –

+0

Quindi, ecco la cosa: probabilmente stai impostando il tipo di supporto non RGB sulla fotocamera e imposti Sample Grabber per accettare solo i video RGB. Quindi chiedi che queste due cose siano collegate insieme ... Può ancora succedere se (a) la fotocamera decide di provare un altro tipo di supporto, non quello che hai indicato di usare, o (b) ci sarà un altro filtro intermedio e di nuovo avviene il cambio del tipo di supporto. –

+1

... È possibile aggirare questo problema impostando il tipo di supporto in modo esplicito, come ho scritto sopra, o inserendo un campione aggiuntivo che accetta qualsiasi video immediatamente dopo il filtro della telecamera, in modo che tutte le seguenti opezioni coinvolgano il pin di output di SG e non le telecamere. Ciò preserverebbe il tipo di supporto originale selezionato tramite SetFormat. –

0

Steve, non è necessario ricostruire la fotocamera (da moniker) in SetCaptureFormat ma utilizzare g_pIBaseFilterCam.

Problemi correlati