DShow 获取 摄像头名称

WIN10 + VS2015 看不惯用VC6.0的老古董们写的代码,自己写的,这是微软Windows SDK API 示例代码改编的

#include <windows.h>
#include <dshow.h>
#include <vector>
#include <comutil.h>
using namespace std;
#pragma comment(lib,"comsuppw")
#pragma comment(lib, "strmiids")
#pragma comment(lib, "ole32")
#pragma comment(lib, "oleaut32")

HRESULT EnumerateDevices(REFGUID category, IEnumMoniker **ppEnum)
{
    // Create the System Device Enumerator.
    ICreateDevEnum *pDevEnum;
    HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, nullptr,
        CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum));
    if (SUCCEEDED(hr))
    {
        // Create an enumerator for the category.
        hr = pDevEnum->CreateClassEnumerator(category, ppEnum, 0);
        if (hr == S_FALSE)
        {
            hr = VFW_E_NOT_FOUND;  // The category is empty. Treat as an error.
        }
        pDevEnum->Release();
    }
    return hr;
}
void DisplayDeviceInformation(IEnumMoniker *pEnum,vector<string>& list)
{
    IMoniker *pMoniker = nullptr;

    while (pEnum->Next(1, &pMoniker, nullptr) == S_OK)
    {
        IPropertyBag *pPropBag;
        HRESULT hr = pMoniker->BindToStorage(nullptr,nullptr, IID_PPV_ARGS(&pPropBag));
        if (FAILED(hr))
        {
            pMoniker->Release();
            continue;
        }

        VARIANT var;
        VariantInit(&var);

        // Get description or friendly name.
        hr = pPropBag->Read(L"Description", &var, nullptr);
        if (FAILED(hr))
        {
            hr = pPropBag->Read(L"FriendlyName", &var, nullptr);
        }
        if (SUCCEEDED(hr))
        {
            std::string name = _com_util::ConvertBSTRToString(var.bstrVal);
//            printf("%s\n", name.c_str());//设备名称
            list.push_back(name);
            VariantClear(&var);
        }
        hr = pPropBag->Write(L"FriendlyName", &var);
        // WaveInID applies only to audio capture devices.
        hr = pPropBag->Read(L"WaveInID", &var, nullptr);
        if (SUCCEEDED(hr))
        {
//            printf("WaveIn ID: %d\n", var.lVal);////设备ID
            VariantClear(&var);
        }
        hr = pPropBag->Read(L"DevicePath", &var, nullptr);
        if (SUCCEEDED(hr))
        {
            // The device path is not intended for display.
//            printf("Device path: %S\n", var.bstrVal);
            VariantClear(&var);
        }

        pPropBag->Release();
        pMoniker->Release();
    }
}

void GetCameraName(vector<string>& list)
{
    HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
    if (SUCCEEDED(hr)){
        IEnumMoniker *pEnum;
        hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum);
        if (SUCCEEDED(hr)){
            DisplayDeviceInformation(pEnum,list);
            pEnum->Release();
        }
//麦克风...........
//        hr = EnumerateDevices(CLSID_AudioInputDeviceCategory, &pEnum);
//        if (SUCCEEDED(hr)){
//            DisplayDeviceInformation(pEnum,list);
//            pEnum->Release();
//        }
        CoUninitialize();
    }
}

void test01()
{
    vector<string> list;
    GetCameraName(list);

    for(int i=0;i<list.size();++i)
    {
        printf("Device: %s\n",list[i].c_str());
    }
}

int main()
{
    test01();
    return 1;
}

猜你喜欢

转载自blog.csdn.net/douzi949389/article/details/86646460