如何在windows上获取视频捕获设备(网络摄像头)列表?(C+;+;) 所以我们有一个简单的C++ Win32控制台应用程序。我们所要做的就是打印网络摄像机和其他可用视频捕获设备的列表。我们希望尽可能多地使用windows API—没有外部LIB—毕竟—我们只想打印一个列表—而不是飞上月球!)怎么做这样的事

如何在windows上获取视频捕获设备(网络摄像头)列表?(C+;+;) 所以我们有一个简单的C++ Win32控制台应用程序。我们所要做的就是打印网络摄像机和其他可用视频捕获设备的列表。我们希望尽可能多地使用windows API—没有外部LIB—毕竟—我们只想打印一个列表—而不是飞上月球!)怎么做这样的事,c++,visual-studio,winapi,visual-studio-2010,device,C++,Visual Studio,Winapi,Visual Studio 2010,Device,我自己的研究: 我找到了这个,但我仍然不知道如何将设备列表输出到屏幕=((对不起,我是C++新手) …更多的研究 在主题中最简单的ms示例之一中发现 HRESULT OnInitDialog(HWND hwnd, ChooseDeviceParam *pParam) { HRESULT hr = S_OK; HWND hList = GetDlgItem(hwnd, IDC_DEVICE_LIST); // Display a list of the devices.

我自己的研究: 我找到了这个,但我仍然不知道如何将设备列表输出到屏幕=((对不起,我是C++新手)

…更多的研究

在主题中最简单的ms示例之一中发现

HRESULT OnInitDialog(HWND hwnd, ChooseDeviceParam *pParam)
{
    HRESULT hr = S_OK;

    HWND hList = GetDlgItem(hwnd, IDC_DEVICE_LIST);

    // Display a list of the devices.

    for (DWORD i = 0; i < pParam->count; i++)
    {
        WCHAR *szFriendlyName = NULL;

        hr = pParam->ppDevices[i]->GetAllocatedString(
            MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME,
            &szFriendlyName,
            NULL
            );

        if (FAILED(hr))
        {
            break;
        }

        int index = ListBox_AddString(hList, szFriendlyName);

        ListBox_SetItemData(hList, index, i);

        CoTaskMemFree(szFriendlyName);
    }
HRESULT ONINITIAlog(HWND HWND,选择DeviceParam*pParam)
{
HRESULT hr=S_正常;
HWND hList=GetDlgItem(HWND,IDC设备列表);
//显示设备列表。
对于(DWORD i=0;icount;i++)
{
WCHAR*szFriendlyName=NULL;
hr=pParam->ppDevices[i]->GetAllocatedString(
MF\u DEVSOURCE\u属性\u友好\u名称,
&szFriendlyName,
无效的
);
如果(失败(小时))
{
打破
}
int index=ListBox_AddString(hList,szFriendlyName);
ListBox_SetItemData(hList,index,i);
CoTaskMemFree(szFriendlyName);
}
看起来它应该做的工作,但我不知道如何将它包括到简单的命令行应用程序,以便输出数据


本系列还包括:

  • 并且有正确的、经过测试的答案
  • 用正确的,还没有被我的答案检验过的
  • 有正确的、经过测试的答案


答案不是opencv特定的

从所示的示例中,将以下代码复制到dev.c中。然后打开命令行并设置所有SDK变量。在指向ole32.lib和oleaut32.lib的命令行链接处,它将显示所有设备

cl dev.c ole32.lib oleaut32.lib

dev.exe将在命令行上给出该列表

#include <windows.h>
#include <dshow.h>

#pragma comment(lib, "strmiids")

HRESULT EnumerateDevices(REFGUID category, IEnumMoniker **ppEnum)
{
    // Create the System Device Enumerator.
    ICreateDevEnum *pDevEnum;
    HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,  
        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)
{
    IMoniker *pMoniker = NULL;

    while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
    {
        IPropertyBag *pPropBag;
        HRESULT hr = pMoniker->BindToStorage(0, 0, 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, 0);
        if (FAILED(hr))
        {
            hr = pPropBag->Read(L"FriendlyName", &var, 0);
        }
        if (SUCCEEDED(hr))
        {
            printf("%S\n", var.bstrVal);
            VariantClear(&var); 
        }

        hr = pPropBag->Write(L"FriendlyName", &var);

        // WaveInID applies only to audio capture devices.
        hr = pPropBag->Read(L"WaveInID", &var, 0);
        if (SUCCEEDED(hr))
        {
            printf("WaveIn ID: %d\n", var.lVal);
            VariantClear(&var); 
        }

        hr = pPropBag->Read(L"DevicePath", &var, 0);
        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 main()
{
    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    if (SUCCEEDED(hr))
    {
        IEnumMoniker *pEnum;

        hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum);
        if (SUCCEEDED(hr))
        {
            DisplayDeviceInformation(pEnum);
            pEnum->Release();
        }
        hr = EnumerateDevices(CLSID_AudioInputDeviceCategory, &pEnum);
        if (SUCCEEDED(hr))
        {
            DisplayDeviceInformation(pEnum);
            pEnum->Release();
        }
        CoUninitialize();
    }
}
#包括
#包括
#pragma注释(lib,“strmids”)
HRESULT枚举设备(参考GUID类别,IEnumMoniker**ppEnum)
{
//创建系统设备枚举器。
ICreateDevEnum*pDevEnum;
HRESULT hr=CoCreateInstance(CLSID_SystemDeviceEnum,NULL,
CLSCTX_INPROC_服务器,IID_PPV_参数(&pDevEnum));
如果(成功(hr))
{
//为类别创建枚举数。
hr=pDevEnum->CreateClassEnumerator(类别,ppEnum,0);
如果(hr==S_FALSE)
{
hr=VFW_E_NOT_FOUND;//类别为空。视为错误。
}
pDevEnum->Release();
}
返回人力资源;
}
无效显示设备信息(IEnumMoniker*pEnum)
{
IMoniker*pMoniker=NULL;
而(pEnum->Next(1,&pMoniker,NULL)==S_OK)
{
IPropertyBag*pPropBag;
HRESULT hr=pMoniker->BindToStorage(0,0,IID_PPV_ARGS(&pPropBag));
如果(失败(小时))
{
pMoniker->Release();
继续;
} 
变异变量;
方差(var);
//获取描述或友好名称。
hr=pPropBag->Read(L“Description”,&var,0);
如果(失败(小时))
{
hr=pPropBag->Read(L“FriendlyName”,&var,0);
}
如果(成功(hr))
{
printf(“%S\n”,var.bstrVal);
方差线性化(&var);
}
hr=pPropBag->Write(L“FriendlyName”和&var);
//WaveInID仅适用于音频捕获设备。
hr=pPropBag->Read(L“WaveInID”和var,0);
如果(成功(hr))
{
printf(“WaveIn ID:%d\n”,var.lVal);
方差线性化(&var);
}
hr=pPropBag->Read(L“设备路径”&变量,0);
如果(成功(hr))
{
//设备路径不用于显示。
printf(“设备路径:%S\n”,var.bstrVal);
方差线性化(&var);
}
pPropBag->Release();
pMoniker->Release();
}
}
void main()
{
HRESULT hr=coinitializex(NULL,COINIT\u多线程);
如果(成功(hr))
{
伊努莫尼克*佩努姆;
hr=枚举设备(CLSID\u VideoInputDeviceCategory和pEnum);
如果(成功(hr))
{
显示设备信息(pEnum);
pEnum->Release();
}
hr=枚举设备(CLSID_音频输入设备类别和pEnum);
如果(成功(hr))
{
显示设备信息(pEnum);
pEnum->Release();
}
coninitialize();
}
}

它不直接使用win32。我不需要lib-我只需要一个简单的列表!可能只需要一个请求……我认为您必须使用directshow/vfw,因为它可以管理摄像头-我不相信您可以使用raw访问directshow摄像头win32@Naveen,我得到的不是那么友好。BSTR=0x0000023ac00eac58 L“\\\\?\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\?