Ich habe ein Problem bei der Kontrolle der Kameraparameter. Hier ist die Funktion Helligkeitsparameter einstellen (ich Verlängerung der Code von Windows Media Foundation recording audio):IAMVideoProcAmp GetRange funktioniert nur nach Verzögerung (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;
}
Es scheint, ich brauche eine Pause einzulegen, bevor GetRange() -Methode, sonst erhalte ich „Element nicht gefunden“ Fehler . QueryInterface funktioniert korrekt, da ich den HRESULT-Wert überprüfe und spVideo unabhängig von der Verzögerung gefüllt wird. Weiß jemand, wie man das bewerkstelligen kann, ohne willkürliche Verzögerungen einzuführen?
Ich nehme an, Sie müssen die Videoaufnahme von dieser Quelle starten und die Parameter auf dem aktiven Gerät ändern. Dies sollte sicherstellen, dass das Backstage-Zeug richtig initialisiert ist. –