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

2024-04-03

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

我自己的研究: 我找到了这个官方msdn样本 http://msdn.microsoft.com/en-us/library/dd940326(VS.85).aspx但我仍然不知道如何将设备列表输出到屏幕上=((抱歉 - 我是 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);
    }

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


也来自这个系列:

  • 如何获取Linux上的视频捕获设备列表? https://stackoverflow.com/questions/4290834/how-to-get-a-list-of-video-capture-devices-web-cameras-on-linux-ubuntu-c and 有关获取相机名称的特殊详细信息 https://stackoverflow.com/questions/4483366/how-to-get-a-list-video-capture-devices-names-web-cameras-on-linux-ubuntu具有正确且经过测试的答案
  • 如何获取 Mac 操作系统上的视频捕获设备列表? https://stackoverflow.com/questions/4532263/how-to-get-a-list-of-video-capture-devices-web-cameras-on-mac-os-c正确,但尚未经过我的答案测试
  • 如何获取 Windows 上的视频捕获设备列表? https://stackoverflow.com/questions/4286223/how-to-get-a-list-of-video-capture-devices-web-cameras-on-windows-c具有正确且经过测试的答案
  • 如何使用 Qt(跨平台)获取视频捕获设备名称列表? https://stackoverflow.com/questions/4637594/how-to-get-a-list-video-capture-devices-names-web-cameras-using-qt-crossplatfo

从所示示例中,将以下代码复制到 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();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • VS2010分析器:是否可以分析一种特定方法?

    可能有一些方法可以打开和关闭代码分析 或者您可以选择要分析的特定函数吗 您还可以使用分析器的数据收集 API 来启动和停止围绕您感兴趣的方法进行分析 请参阅这篇 MSDN 文章 http msdn microsoft com en us l
  • C# 如何比较两个字符串并指出哪些部分不同

    例如 如果我有 string a personil string b personal 我想得到 string c person i l 然而 它不一定是单个字符 我也可以这样 string a disfuncshunal string b
  • fgetc,检查 EOF

    在书里Linux系统编程我读过一些这样的内容 fgetc返回读取为的字符unsigned char投射到int or EOF在文件末尾或错误 使用时的一个常见错误fgetc is char c if c fgetc EOF 该代码的正确版本
  • 了解左值到右值转换的示例

    我很难理解这段代码 来自 C 14 草案标准的示例 转换拉瓦尔 调用未定义的行为g false 为什么constexpr使程序有效 另外 不访问 是什么意思 y n 在两次通话中g 我们正在返回n数据成员那么为什么最后一行说它不能访问它呢
  • Xamarin 中 QR 扫描后的处理对话框

    我在Xamarin应用程序中使用QR码扫描仪 当它扫描QR码时 它会执行一些操作 大约需要一分钟 而在执行操作时 我想在屏幕上显示一个加载对话框 但是 它没有显示在屏幕上 并且在应用程序的其他地方 它运行得很好 Code var expec
  • 未初始化成员的警告在 C++11 上消失

    我编译这个简单的程序 include
  • C# 字典循环增强

    我有一本包含大约 100 万个条目的字典 我不断地循环字典 public void DoAllJobs foreach KeyValuePair
  • 与智能指针的返回类型协方差

    在 C 中我们可以这样做 struct Base virtual Base Clone const virtual Base struct Derived Base virtual Derived Clone const overrides
  • C# - 当站点上没有活动时,Quartz 调度程序停止运行

    我用quartz调度器创建了asp net站点 该作业正在后台运行 站点上没有其他活动 Quartz 调度程序每 30 分钟调度一次 IIS启动后 Scheduler运行正常 但一段时间后 Scheduler 停止运行 大约 1 小时 如果
  • 欢迎消息在网络聊天中不可见,但可以在模拟器中使用

    IConversationUpdateActivity update message using var scope Microsoft Bot Builder Dialogs Internals DialogModule BeginLif
  • 编译使用Basler相机的程序

    我正在尝试使用 Basler 相机捕获图像的 C 程序来工作 我拿到 来自制造商的代码 它应该 非常容易使用 但是 链接它有 成为一场噩梦 我的 C 时代已经过去了 最近只使用 Matlab 所以我可能会犯一些愚蠢的错误 但请赐教 代码如下
  • 为什么不能使用 C# 对象初始值设定项语法调用方法? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • C++ 标准是否保证未使用的私有字段会影响 sizeof?

    考虑以下结构 class Foo int a 在 g 中测试 我明白了sizeof Foo 4但这是由标准保证的吗 是否允许编译器注意到a是一个未使用的私有字段并将其从类的内存表示中删除 导致更小的 sizeof 我不希望任何编译器真正进行
  • GoogleTest:如何跳过测试?

    使用 Google Test 1 6 Windows 7 Visual Studio C 如何关闭给定的测试 又名如何阻止测试运行 除了注释掉整个测试之外 我还能做些什么吗 The docs https github com google
  • LINQ 分组依据和选择集合

    我有这个结构 Customer has many Orders has many OrderItems 我想生成一个列表CustomerItems通过 LINQ 给出的子集OrderItems List of new Customer Li
  • STL迭代器是否保证集合更改后的有效性?

    假设我有某种集合 并且我在它的开头获得了一个迭代器 现在假设我修改了该集合 无论集合或迭代器的类型如何 我仍然可以安全地使用迭代器吗 为了避免混淆 以下是我讨论的操作顺序 获取集合的迭代器 修改集合 显然 不是其中的元素 而是集合本身 使用
  • 我试图使这段代码递归,但由于某种原因它不起作用[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我试图使这
  • 如何为 Blazor MapFallbackToFile() 生成正确的错误

    我有一个项目想要用作 Web API 和 Blazor wasm UI 该 API 也可以从其他项目访问 因此我希望该 API 向消费者提供有用的错误详细信息 我现在通过使用该网站来实现这两个目的MapFallbackToFile 方法 但
  • JavaScript Intellisense 在 Visual Studio 2015 中不起作用

    我知道这个问题在网上以及整个网络上都有很多重复的问题 不幸的是 所提出的建议都不起作用 除了重新安装 VS 15 之外 我已经完成了所有操作 如果我可以帮助的话 我宁愿不这样做 我去过的一个网站 references js 背后的故事 ht
  • JSON.NET 序列化 JObject,同时忽略 null 属性

    我有一个JObject它被用作template用于调用 RESTful Web 服务 这JObject通过解析器创建 并且由于它用作模板告诉用户端点架构是什么样子 所以我必须找到一种方法来保留所有属性 这就是为什么我将它们的值默认为null

随机推荐

  • 绑定通用成员函数

    有时我需要将一些成员函数绑定到其调用对象 以相同的同构方式对待成员函数和非成员函数 例如 典型的回调示例 include
  • 获取插入符位置的元素节点(在 contentEditable 中)

    假设我有一些像这样的 HTML 代码 h1 Some heading text here h1 p Some text here p 现在插入符号 闪烁的光标 在 h1 元素 让我们用这个词来说 heading 如何使用 JavaScrip
  • 如何将 jqGrid (4.x) 配置为 TreeView

    我已经获取了演示代码并尝试修改它以满足我的需要 但不幸的是我无法获得所需的结果 树网格正在加载和 绑定 但在展开和折叠期间层次结构似乎存在问题 我希望它默认保持展开状态 看起来它正在对它应该的数据发出另一个 ajax 请求不要做 第一次调用
  • 如何使用 Twitter Bootstrap v3.0 构建两列流体布局

    由于 bootstrap 在 v3 0 中删除了 fluid css 类 因此我找不到构建两列流体布局的方法 目标是实现类似于旧文档中的流体布局示例的布局 http getbootstrap com 2 3 2 scaffolding ht
  • Silverlight 控件是否应该重新加载到页面上?

    几个月前 我开始自己开发 Silverlight 应用程序 我很快发现我的大多数控件无法获得预期的垃圾回收 我在 WinDBG 和 ANTS 内存分析器上苦苦挣扎了大约一周 然后在 Silverlight 论坛 http forums si
  • Visual Studio 2013 写入时缩进不起作用

    我有这样的代码 class Myclass 我现在想添加一些代码 例如一个方法 我在 之后直接按 Enter 键 希望得到这个 是光标所在的位置 class Myclass 不过我得到这个 class Myclass 如果我现在输入一个方法
  • 动态加载的JavaScript可以卸载吗?

    我正在编写一个具有静态外壳和动态内容部分的 Web 应用程序 当用户浏览系统时 动态内容部分有许多更新 当加载新的内容块时 它还可以选择加载另一个 JavaScript 文件 以良好管理的名义 我从 DOM 中删除了适用于旧内容块的脚本块
  • 如何在 C# 中创建 NVarchar(max) Sqlparameter? [复制]

    这个问题在这里已经有答案了 我有以下代码来使用存储过程并输入字符串参数 JobNumbers 来拉回 DataTable 该参数是动态创建的作业编号字符串 因此长度未知 using SqlConnection connection new
  • 使用季度数据格式化scale_x_连续轴

    我有一个统计数据集 分为两组 汇总为季度计数 这Date Qtr变量是通过 lubridate 从更大的数据集中导出的 数据框如下 dat structure list Group structure c 1L 1L 1L 1L 1L 1L
  • Rails 嵌套表单不更新嵌套模型

    我在尝试更新表单中的嵌套模型时遇到问题 我没有收到任何错误 但属性没有更新 我有以下模型 class Trip lt ActiveRecord Base has many segments accepts nested attributes
  • Moment.js 一周的第一天不正确

    这是我第一次使用 Moment js 我尝试检索一周第一天的日期 在欧洲这通常是星期一 无论我做什么 星期天都是一周的第一天 我尝试设置不同的语言 本地或全球 但无济于事 我使用 langs min js 文件moment js githu
  • 使用正则表达式拆分和替换 javascript 中的 unicode 单词

    需要将 unicode 单词列表放入 中的 unicode 字符串中 有我的代码 var txt One one one two two two two two tw tw u three tw f ur var re new RegExp
  • valueOf 总是覆盖 JavaScript 中的 toString 吗?

    对象的 toString 方法是否存在任何表达式隐含地调用重写其 valueOf 方法 在下面的示例中 始终隐式调用 valueOf 覆盖 toString 4 toString function return 4 valueOf func
  • 从fetch->promise->response获取数据

    我正在尝试将一些数据发布到服务器 但我不知道如何取回响应数据 我有以下代码 fetch url method POST headers Accept application json Content Type application jso
  • 如何使用 Apache Thrift 将图像从 Python 流式传输到 C++

    如何使用 Apache Thrift 流式传输文件 图像 我搜索了很多关于 Thrift 的信息 但没有找到任何与之相关的书面文档 为什么 Facebook 在没有文档的情况下开源这个项目 我建议的方法是设置您的服务以分块传送数据 如下所示
  • MVVM 和嵌套视图模型

    我有一个简单的示例 其中我正在创建一个由列表框组成的视图 并且该列表框显示一堆项目 我想知道我是否在这里正确创建视图模型和模型类 在这种情况下使用正确的任何值 我知道这有点主观 但我当前的解决方案感觉不正确 这是一个简化版本 ViewMod
  • 即使将frameborder设置为0后,iframe边框周围仍然存在空白

    即使将 iframe 中的frameborder属性设置为0后 iframe边框周围仍然存在一些空白 与原始url 链接页面不同 有没有其他方法可以消除空白 或者必须在 iframe 周围呈现一些白色 因为它位于网页 或其一部分 内 并且不
  • Rails 4:如何使用 Sass 映射?

    我正在尝试清理 Rails 4 1 应用程序的一些样式 我不想列出每种颜色及其变体 而是创建颜色 值的映射 然后通过迭代生成 CSS colors css scss colors red 330000 blue 003300 但是 我从中得
  • 如何使用间隔中的年和月动态连续显示零?

    我正在尝试创建一个查询来显示计数设置年份和月份间隔 12 个月 年和月是动态值 间隔是 12 个月的静态值 例如 设置月份 12 年份 2013 This will count from 2013 12 01 to 2014 11 30 其
  • 如何获取 Windows 上的视频捕获设备(网络摄像头)列表? (C++)

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