gpt4 book ai didi

c++ - 如何获取 Windows 上的视频捕获设备(网络摄像头)列表? (C++)

转载 作者:可可西里 更新时间:2023-11-01 17:19:10 27 4
gpt4 key购买 nike

所以我们有一个简单的 C++ win32 控制台应用程序。我们想要的只是打印可用的网络摄像头和其他视频捕获设备的列表。我们希望尽可能多地使用 Windows api - 没有外部库 - 毕竟 - 我们想要的只是打印出一个列表 - 而不是飞到月球上!)如何做这样的事情?

我自己的研究:我找到了这个 official msdn sample但我仍然不知道如何将设备列表输出到屏幕上 =((抱歉 - 我是 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);
}

看起来它应该完成这项工作,但我不知道如何将其包含到简单的命令行应用程序中以便输出数据...


同样来自这个系列:

最佳答案

从显示的示例中,将以下代码复制到 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();
}
}

关于c++ - 如何获取 Windows 上的视频捕获设备(网络摄像头)列表? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4286223/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com