IAMVideoProcAmp GetRange只工作后延迟(c++)
IAMVideoProcAmp GetRange only works after delay (C++)?
我有一个问题,试图控制相机参数。以下是设置亮度参数的函数(我正在扩展Windows Media Foundation录制音频的代码):
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视频类属性中,您可以找到下一个文本"调用KsSynchronousDeviceControl或DeviceIoControl以从用户模式组件发出属性请求。DeviceIoControl记录在Microsoft Windows SDK文档中。"顺便说一下,使用DeviceIoControl
不需要激活MediaSource。DeviceIoControl
功能只需要摄像头的symbolicLink。然而,编写直接使用驱动程序的代码可能非常困难(我在一个c++类中编写了它)。
相关文章:
- 如何仅为一个函数添加延迟
- 以在Qt中的IF语句中设置时间延迟
- 模板化类中静态成员的延迟初始化
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- 将自定义函数传递到基抽象类中以延迟执行
- 我希望改进或要求我目前的延迟/睡眠方法。C++
- 如何在 c++ 中延迟?
- 如何测量管道延迟?
- 获取毫秒延迟的错误值
- C++异常被捕获延迟,可能导致这种情况的原因是什么?
- 我的子类的属性是延迟初始化的
- 为什么有些延迟加载 DLL 会立即使用 FFMPEG 卸载?
- 代码战士的延迟
- 为什么当通过 TCP 发送的消息速率增加时,请求-响应消息对的延迟会降低?
- C++延迟后的优化器调用函数
- 将作业传递给另一个函数,而不会延迟 arduino
- 延迟 _getch() 输入
- 为什么添加延迟会提高此多线程环境中的数据吞吐量?
- 如何延迟生成已完成的项目序列并对其进行迭代
- 呼叫 QSound,它们之间有延迟 Qt C++