問(wèn)題描述
所以我們有一個(gè)簡(jiǎn)單的 C++ win32 控制臺(tái)應(yīng)用程序.我們想要的只是打印可用的網(wǎng)絡(luò)攝像機(jī)和其他視頻捕獲設(shè)備的列表.我們想盡可能多地使用 windows api - 沒(méi)有外部庫(kù) - 畢竟 - 我們想要的只是打印出一個(gè)列表 - 而不是飛上月球!)如何做這樣的事情?
So we have a simple C++ win32 console app. All we want is to print list of web cameras and other video capture devices that are avaliable. We want to use windows apis as much as possible - no external libs - after all - all we want is to print out a a list - not to fly onto the moon!) How to do such thing?
我自己的研究:我找到了這個(gè) official msdn sample 但我仍然不知道如何將設(shè)備列表輸出到屏幕上=((抱歉 - 我是 C++ 新手)
My own reserch: I found this official msdn sample but I still do not get how to output device list onto screen=( (sorry - I am new to C++)
...更多的研究...
... some more reserch...
在最簡(jiǎn)單的 ms 主題示例之一中發(fā)現(xiàn)了這個(gè)
In one of simpliest ms samples on topic found this
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);
}
看起來(lái)應(yīng)該可以完成這項(xiàng)工作,但我不知道如何將其包含在簡(jiǎn)單的命令行應(yīng)用程序中以輸出數(shù)據(jù)...
looks like it should do the job but I do not get how to include this into simple command line app so to output data...
也來(lái)自這個(gè)系列:
- 如何在 Linux 上獲取視頻捕獲設(shè)備列表? 和 有關(guān)獲取相機(jī)名稱的特殊詳細(xì)信息 并提供正確的、經(jīng)過(guò)測(cè)試的答案
- 如何在 Mac OS 上獲取視頻捕獲設(shè)備的列表?正確的,尚未經(jīng)過(guò)我的回答測(cè)試
- 如何獲取 Windows 上的視頻捕獲設(shè)備列表? 提供正確的、經(jīng)過(guò)測(cè)試的答案
- 如何使用 Qt(跨平臺(tái))獲取視頻捕獲設(shè)備名稱列表?
- How to get a list of video capture devices on linux? and special details on getting cameras NAMES with correct, tested answers
- How to get a list of video capture devices on Mac OS? with correct, not yet tested by my answers
- How to get a list of video capture devices on windows? with correct, tested answers
- How to get a list video capture devices NAMES using Qt (crossplatform)?
推薦答案
從顯示的示例中,將以下代碼復(fù)制到 dev.c 中.然后打開(kāi)設(shè)置了所有 SDK 變量的命令行.在命令行鏈接到 ole32.lib 和 oleaut32.lib.然后它會(huì)顯示所有設(shè)備.
From the examples shown, copy the following code into dev.c. Then open the command line with all the SDK variables set. At the command line link to ole32.lib and oleaut32.lib. It will then show you all the devices.
cl dev.c ole32.lib oleaut32.lib
cl dev.c ole32.lib oleaut32.lib
dev.exe 會(huì)在命令行中給出列表.
dev.exe will give out the list on the command line.
#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
", 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
", 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
", 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();
}
}
這篇關(guān)于如何獲取 Windows 上的視頻捕獲設(shè)備(網(wǎng)絡(luò)攝像頭)列表?(C++)的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!