一、主要点:
1、调用Windows系统函数,搜寻目标设备:
if (m_path.isEmpty())
return;
// 创建系统设备枚举器
ICreateDevEnum* dev_enum = nullptr;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, nullptr, CLSCTX_INPROC, IID_ICreateDevEnum, (void**)&dev_enum);
if (FAILED(hr))
{
return;
}
IGraphBuilder* graph = nullptr;
ICaptureGraphBuilder2* builder = nullptr;
// Create the Filter Graph Manager.
hr = CoCreateInstance(CLSID_FilterGraph, nullptr, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&graph);
if (SUCCEEDED(hr))
{
// Create the Capture Graph Builder.
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, nullptr,
CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2,
(void**)&builder);
if (SUCCEEDED(hr))
{
hr = builder->SetFiltergraph(graph);
}
else
{
return;
}
}
else
{
return;
}
// 为类别创建枚举器
IEnumMoniker* class_enum = nullptr;
hr = dev_enum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &class_enum, 0);
if (hr != S_OK)
return;
IMoniker* moniker = nullptr;
ULONG fetched;
// 使用 IEnumMoniker 接口枚举所有的设备标识
while (class_enum->Next(1, &moniker, &fetched) == S_OK)
{
IPropertyBag* prop_bag = nullptr;
hr = moniker->BindToStorage(NULL, NULL, IID_IPropertyBag, (void**)&prop_bag);
VARIANT var_name;
VariantInit(&var_name);
hr = prop_bag->Read(L"DevicePath", &var_name, NULL);
WCHAR* devicePath = var_name.bstrVal;
if (devicePath != nullptr) {
QString dest = Wchat_tToQString(devicePath);
qDebug()<<" dest:"<<dest;
if (m_path.contains(dest)) // 设备匹配
{
IBaseFilter* src = nullptr;
moniker->BindToObject(0, 0, IID_IBaseFilter, (void

文章详细描述了如何使用WindowsAPI在C++中通过ICreateDevEnum和CaptureGraphBuilder枚举视频输入设备,获取和设置参数(如放大/缩小)的过程,以及在遇到编译错误时的解决方案。

270

被折叠的 条评论
为什么被折叠?



