2016-07-04 4 views
2

카메라 매개 변수를 제어하는 ​​데 문제가 있습니다. 여기에 (내가 Windows Media Foundation recording audio의 코드를 확장하고) 밝기 매개 변수를 설정하는 기능입니다 : 그렇지 않으면 나는 "요소를 찾을 수 없습니다"점점 오전,IAMVideoProcAmp GetRange는 지연 후에 만 ​​작동합니다 (C++)?

HRESULT deviceInput::SetupCamera(UINT32 deviceID) { 
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); 
IMFActivate* device = this->getDevice(deviceID); 
if (device == NULL) 
    return E_FAIL; 
IMFMediaSource* pCameraSource = NULL; 
HRESULT hr = (m_devices[deviceID])->ActivateObject(IID_PPV_ARGS(&pCameraSource)); 
if (FAILED(hr)) { 
    wcout << "Could not activate object" << endl; 
    return hr; 
} 
IAMVideoProcAmp* spVideo = NULL; 
hr = CoCreateInstance(__uuidof(IMFMediaSource) , NULL, CLSCTX_INPROC_SERVER, __uuidof(IAMVideoProcAmp), 
         reinterpret_cast<void**>(&spVideo)); 
hr = pCameraSource->QueryInterface(IID_PPV_ARGS(&spVideo)); 
if(FAILED(hr)) { 
    wcout << "Could not get interface" << endl; 
    return hr; 
} 
if(spVideo) { 
    wcout << "Getting brightness" << endl; 
    long Min, Max, step, def, control; 
    Sleep(100); // if I remove this - will get "Element not found error" 
    hr = spVideo->GetRange(VideoProcAmp_Brightness, &Min, &Max, &step, &def, &control); 
    if (SUCCEEDED(hr)) 
     wcout << "Brightness. Min = " << Min <<", max = " << Max << endl; 
    else { 
     _com_error err(hr); 
     LPCTSTR errMsg = err.ErrorMessage(); 
     wcout << "Failed: " << errMsg << endl; 
    } 
} 
CoUninitialize(); 
return hr; 
} 

내가() 메소드 GetRange를 호출하기 전에 일시 중지를 삽입해야 할 것 같다 오류 . HRESULT 값을 확인하고 지연에 관계없이 spVideo가 채워지기 때문에 QueryInterface가 올바르게 작동합니다. 누구든지 임의의 지연을 삽입하지 않고이 작업을 수행하는 방법을 알고 있습니까?

+0

이 소스에서 비디오 캡처를 시작하고 활성 장치에서 매개 변수를 변경해야한다고 가정합니다. 이렇게하면 무대 뒤 물건이 제대로 초기화됩니다. –

답변

1

잘 알려진 문제를 설명했습니다. 사실은 활성화 시스템을 실행 한 후 카메라 드라이버를 초기화 할 시간이 필요하다는 것입니다. 시간이 필요해. Sleep 함수를 실제로 제거하려면 DeviceIoControl 을 통해 카메라 속성을 호출해야합니다. MSDN USB Video Class Properties에서 다음 텍스트 "사용자 모드 구성 요소로부터 속성 요청을하려면 KsSynchronousDeviceControl 또는 DeviceIoControl을 호출합니다 .DirectorIoControl은 Microsoft Windows SDK 설명서에 설명되어 있습니다. . " 그런데 DeviceIoControl을 사용하는 경우 MediaSource를 활성화 할 필요가 없습니다. DeviceIoControl 함수는 카메라의 심볼 링크 만 있으면됩니다. 그러나 드라이버로 직접 작업하기위한 코드를 작성하는 것은 매우 어려울 수 있습니다 (한 C++ 클래스에서이 코드를 작성했습니다).

+0

Evgeny, 답변 주셔서 감사합니다. 따라서 드라이버가 MediaFoundation 클래스에서 준비가되었는지 확인할 방법이 없습니다 (어떤 종류의 호출을 차단할 수 있습니까?). – Ilya

+0

아니요. 'MediaFoundation'을 통해 카메라 속성으로 작업 할 방법이 없습니다. 'IAMVideoProcAmp' DirectShow 또는'DeviceIoControl'을 통해서만. 카메라는 하드웨어 장치입니다. 즉, Windows 용 장치 (예 : 하드 디스크) - DeviceIoControl을 사용하여 작업 할 때와 동일한 코드를 사용해야 함을 의미합니다. –

관련 문제