2014-03-19 2 views
1

웹캠의 소스 필터를 사용하고 있습니다. graphstudio에서 필터를 사용할 때 두 개의 출력 핀이 있습니다. 그러나 코드에서 IEnumPins-> next에 대한 호출은 항상 S_FALSE를 반환합니다. 핀을 만들 수 있지만 그런 것을 찾지 못했던 다른 인터페이스를 찾았습니다.코드에 graphstudio에서 사용 가능한 핀이 없습니다.

enter image description here

어떻게 웹캠 필터에 핀을 추가하는 방법은 무엇입니까? 그들은 graphstudio에서 사용할 수 있다면 그들은 너무 코드에 있어야 맞죠?

여기 내 코드입니다. 반환 값을 확인한 다음 확인되지 않은 경우 반환했습니다. 또한

IPin *GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir) 
{ 
    BOOL  bFound = FALSE; 
    IEnumPins *pEnum; 
    IPin  *pPin; 

    pFilter->EnumPins(&pEnum); 
    while (pEnum->Next(1, &pPin, 0) == S_OK) 
    { 
     PIN_DIRECTION PinDirThis; 
     pPin->QueryDirection(&PinDirThis); 
     if (bFound = (PinDir == PinDirThis)) 
      break; 
     pPin->Release(); 
    } 
    pEnum->Release(); 
    return (bFound ? pPin : 0); 
} 

, 나는이 생각하지 않습니다 : 웹캠 필터

CoInitialize(NULL); 

    IGraphBuilder* graphBuilder = NULL; 
    IMediaControl* mediaControl = NULL; 
    IMediaEvent* mediaEvent = NULL; 

    HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IFilterGraph, (void **)&graphBuilder); 

    HANDLE fileHandle = CreateFile(L"D:\\TEMP\\debug1.log", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, NULL, NULL); 

    graphBuilder->SetLogFile((DWORD_PTR)fileHandle); 
    graphBuilder->QueryInterface(IID_IMediaControl, (void **)&mediaControl); 
    graphBuilder->QueryInterface(IID_IMediaEvent, (void **)&mediaEvent); 

    IBaseFilter* source = NULL; 


    static const GUID CLSID_Webcam = 
    { 0x17CCA71B, 0xECD7, 0x11D0, { 0xB9, 0x08, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 } }; 
    hr = CoCreateInstance(CLSID_Webcam, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&source); 
    if (FAILED(hr)) 
     return hr; 
    hr = graphBuilder->AddFilter(source, L"logitech"); 
    if (FAILED(hr)) 
     return hr; 


    IPin* camOut = GetPin(source, PINDIR_OUTPUT); 
    ... 

GetPin 기능은 핀을 찾을 EnumPins 방법을 사용하는 모든 핀을 반환하지 않는 것을 제외하고는 그러나 모든 것이 잘 작동하는 것 같다 32/64bit 문제입니다. x64로 컴파일하고 graphstudionext의 64 비트 버전도 사용했습니다. 그리고 나는 또한 웹캠 필터의 guid가 정확한지 확인했습니다. (적어도 graphstudionext를 신뢰할 수있는 경우)

답변

3

이것은 코드가 다른 필터를 처리하거나 그렇지 않으면 버그가 있음을 나타냅니다. 일반적으로 비디오 장치가 지원하는 소스 필터에서 핀을 "생성"하지 않습니다. 일반적인 이유는 다음과 같습니다. (a) 효과적으로 다른 필터를 작성하고 있습니다. (b) 코드에 직접 버그가 있습니다. (c) 두 환경에서 서로 다른 필터로 32/64 비트 문제가 있습니다. 다른 일은 거의 없을 수 있습니다. 코드를 단계별로 검사하고 디버그 출력을 추가하면 솔루션으로 연결됩니다.

업데이트. 이와 같은 비디오 캡처 장치는 CoCreateInstance을 사용하여 인스턴스화 할 수 없습니다. 모니 커를 사용하여 생성해야합니다. 일반적으로 열거를 통해 MSDN (소스 코드 스 니펫 포함) : Selecting a Capture Device에 설명되어 있습니다.

아래 코드는 올바르지 않습니다. 참고로이 GUID는 CLSID_Proxy으로 SDK에 선언되어 있습니다.

static const GUID CLSID_Webcam = 
{ 0x17CCA71B, 0xECD7, 0x11D0, { 0xB9, 0x08, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 } }; 
hr = CoCreateInstance(CLSID_Webcam, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&source); 
관련 문제