2011-09-12 20 views
5

Tôi là người mới sử dụng DirectShow và đang làm việc để thêm luồng video vào ứng dụng của mình. Tôi đã xem xét nhiều giải pháp trên mạng (TouchLess, DirectShow.net, v.v.) và kết thúc với điều này small project on Code Project Không có gì nhiều, đó là lý do tại sao tôi chọn nó; Tôi muốn có một cơ sở mã nhỏ để làm việc với, vì tôi cần phải thực hiện tính năng này một cách nhanh chóng.Không thể làm cho IAMStreamConfig.SetFormat() hoạt động với LifeCam Studio

Sau một ngày đọc sách, thử nghiệm và gỡ lỗi, cuối cùng tôi có mọi thứ hoạt động tốt. Có một sự chậm trễ mà là một bummer nhưng tôi có thể lo lắng về điều đó sau này. Vấn đề tôi có tại thời điểm này là the camera is capable of 1280X720 và tôi muốn sử dụng độ phân giải này. Tuy nhiên, có vẻ như nó được xác định ở mức 640x480. Khi tôi đào sâu hơn và sâu hơn và sâu hơn tìm hiểu làm thế nào để thiết lập độ phân giải, cuối cùng tôi nghĩ rằng tôi đã có nó tìm ra. Tôi cũng tìm thấy mã trên trang Code Project đó trong các bình luận mà tôi đã sử dụng làm cơ sở.

Sau 6 giờ thử, tôi không thể thay đổi độ phân giải của máy ảnh này. Tôi không nhận được bất kỳ lỗi nào và HRESULT được trả về từ SetFormat() là 0, nhưng máy ảnh sẽ không thay đổi độ phân giải.

Có quá nhiều mã để dán mọi thứ, nhưng tôi muốn bao gồm phần xây dựng biểu đồ khi tôi hình dung đó là vấn đề ở đâu.

Dưới đây là đoạn code mà thiết lập đồ thị

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] Thêm các) phương pháp ConfigureSampleGrabber (sau đây

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

Đó là khá nhiều mã chính xác từ nguồn CodeProject mã. Sau đó tôi đã thêm phương pháp này để đặt độ phân giải:

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

Tôi đã bước qua mã và xác minh rằng lệnh gọi SetFormat() được thực hiện và trả lại HRESULT hợp lệ. Tuy nhiên, không có thay đổi nào đối với các khung hình đã chụp.

Không có thông báo lỗi, thật khó để biết bắt đầu từ đâu. Tôi hy vọng có một số chuyên gia DirectShow ở đây sẽ thấy vấn đề này, thậm chí tôi sẽ hài lòng với một thời trang tốt "Vâng, làm thế nào để bạn mong đợi máy ảnh thay đổi kích thước khung hình một khi bộ đệm được cấp phát trên ngăn xếp bộ lọc và tiện ích con được khởi tạo thành foobar! Pft ... lol ";)

Dạy tôi, oh GodShow/COM!

[UPDATE # 2] (FYI, thật kỳ lạ khi chúng ta không thể chỉ cần thêm một thông điệp mới cho hệ thống này và cần phải chỉnh sửa bản gốc như thế này) đề nghị

mỗi La Mã của tôi đã sử dụng GraphStudio để nhìn dưới mui xe của đồ thị của tôi. Tôi sẽ thừa nhận rằng tôi vẫn không hiểu chính xác những gì tôi đang xem xét. Tôi đã tìm thấy chức năng "báo cáo văn bản" và nghĩ rằng sẽ hữu ích khi đăng báo cáo đó ở đây trong trường hợp nó hiển thị một số thông tin có giá trị.

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

[Update # 3] - Holy COW, tôi đã bắt đầu cái gì ?! Tại sao googling sâu hơn tôi đã từng googled trước khi tôi came across something that supports lý thuyết của Roman không phù hợp với không gian màu sắc. Tôi downloaded the app và ngay lập tức phải sửa lỗi với bộ đệm quá nhỏ.Sau khi giải quyết mà tôi đã có thể tạo ra các báo cáo sau đây:

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 

Trả lời

3

Bạn đặt nó vào đúng nơi - sau khi nó đã có trong đồ thị bằng AddFilter, nhưng chưa trước khi pin sản lượng của nó được kết nối. Nếu bạn đã thành công HRESULT, thì bạn có thể mong đợi định dạng thay đổi, nhưng có thể có ngoại lệ, chẳng hạn như ví dụ loại phương tiện này không được bộ lọc hạ lưu chấp nhận và họ bắt đầu thương lượng ngay từ đầu.

Bạn không hiển thị ConfigureSampleGrabber ở đây, vì vậy loại phương tiện bạn muốn không được biểu đồ bộ lọc lấy mẫu thử chấp nhận để thử các loại phương tiện thay thế và/hoặc bộ lọc trung gian (như bộ giải mã).

Có một vài điều bạn thực sự có thể làm.

  1. Đối xử lý sự cố bạn có thể muốn:

    1. add the filter graph to ROT, hoặc thay vào đó chỉ install DirectShow Spy để có cùng thực hiện cho bạn tự động
    2. thêm một MessageBox trong mã của bạn ngay sau khi SetCaptureFormat bạn
    3. trong khi hộp thông báo vẫn còn trên màn hình, sử dụng GraphEdit (GraphStudio) để kiểm tra biểu đồ bộ lọc của bạn và xem loại phương tiện nào nó liệt kê trên chốt đầu ra của nó; điển hình là loại phương tiện truyền thông đầu tiên sẽ là một sử dụng cho kết nối thực, vì vậy HRESULT thành công của bạn trong SetFormat cơ bản giả định các loại phương tiện truyền thông tại là trên đầu danh sách này
  2. Để buộc các loại phương tiện, bạn có thể muốn sử dụng IFilterGraph :: ConnectDirect với pin được cấu hình, đó là pin hạ lưu hàng xóm ngay lập tức và loại phương tiện truyền thông mà bạn quan tâm.

Hy vọng điều này sẽ hữu ích.

+0

Tôi đã cập nhật bài đăng gốc để bao gồm phương thức ConfigureSampleGrabber(). Trong thời gian chờ đợi, tôi sẽ xem xét các tùy chọn bổ sung được liệt kê của bạn. Cảm ơn bạn đã trả lời –

+0

Vì vậy, đây là điều: bạn có thể thiết lập loại phương tiện truyền thông không RGB trên máy ảnh, và bạn đặt Sample Grabber để chấp nhận chỉ RGB video. Sau đó, bạn yêu cầu hai thứ này được kết nối với nhau ... Nó vẫn có thể xảy ra nếu (a) camera quyết định thử loại phương tiện khác, không phải loại máy bạn đã hướng dẫn sử dụng hoặc (b) sẽ có một bộ lọc trung gian khác và một lần nữa thay đổi loại phương tiện diễn ra. –

+1

... Bạn có thể làm việc này xung quanh bằng cách đặt loại phương tiện rõ ràng như tôi đã viết ở trên hoặc chèn thêm một bộ lấy mẫu bổ sung chấp nhận bất kỳ video nào ngay sau bộ lọc máy ảnh, sao cho tất cả các phần mở rộng sau đây liên quan đến chốt đầu ra của SG chứ không phải máy ảnh. Điều này sẽ bảo tồn loại phương tiện gốc mà bạn đã chọn thông qua SetFormat. –

0

Steve, bạn không nên xây dựng lại máy ảnh (từ biệt danh) trong SetCaptureFormat nhưng sử dụng g_pIBaseFilterCam.

Các vấn đề liên quan