如何获取 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++) 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何获得蓝牙低功耗设备的实际名称?

    我需要从 ble 传感器获取友好的设备名称 例如 我想找到该设备并告诉用户他们已连接到 我的家庭传感器 我可以找到该设备 但我不知道如何找到该数据 在常规蓝牙中 我相信我可以使用BLUETOOTH DEVICE INFO或winsock 是
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 绑定通用成员函数

    有时我需要将一些成员函数绑定到其调用对象 以相同的同构方式对待成员函数和非成员函数 例如 典型的回调示例 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 没有外部库 毕竟 我们想要的只是打印出一个列表 而不是飞到月球上 如何做这样的事