【QT中使用uvc协议设置/获取usb相机的参数】

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

一、主要点:
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值