我在尝试控制相机参数时遇到问题。这是设置亮度参数的函数(我正在从Windows Media Foundation recording audio扩展代码):

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()方法之前插入一个暂停,否则会出现“找不到元素”错误。 QueryInterface正常工作,因为我正在检查HRESULT值,并且无论延迟如何,spVideo都会被填充。有谁知道如何在不插入任意延迟的情况下使它正常工作?

最佳答案

您描述了一个众所周知的问题。事实是,执行激活系统后,需要一些时间来初始化相机驱动程序。需要时间。如果您确实要删除Sleep函数,则应通过DeviceIoControl调用相机属性
在MSDN USB Video Class Properties上,找到下一个文本“调用KsSynchronousDeviceControl或DeviceIoControl来从用户模式组件发出属性请求。MicrosoftWindows SDK文档中记录了DeviceIoControl。”
顺便说一句,对于DeviceIoControl的使用,它不需要激活MediaSource。 DeviceIoControl函数仅需要照相机的symbolicLink。但是,编写用于直接使用驱动程序的代码可能非常困难(我在一个C++类中编写了代码)。

关于c++ - IAMVideoProcAmp GetRange仅在延迟后才能使用(C++)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38190107/

10-09 13:21