Windows 将枚举视频设备,因此应用程序可以看到设备列表。 我想知道 Windows 是如何详细做到这一点的,这样我就可以处理设备的顺序。 我希望列表中的设备顺序永远不会改变,除非硬件发生变化,但实际取决于 Windows 实现(未找到文档)。
例如,在 ffmpeg dshow 中,他们使用它来枚举设备:
hr = dev_enum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
enum_moniker, 0);
Windows官方文档没有告诉我们扫描设备列表时是如何工作的。
我尝试搜索所有文档,但没有找到好的文档。
在设备驱动程序和应用程序之间有一个巨大的“设备管理器”抽象层(而且并非所有设备都是硬件)。 您的案例在设备管理器和您的应用程序之间有另一个抽象层(DirectShow)。
尽管 Windows 确实枚举了 PCIe 硬件(以加载驱动程序并将设备节点添加到设备管理器),但您不应该太关心这是如何发生的。 您对如何向您呈现该列表感兴趣。
如果应用程序看到的列表与硬件枚举的顺序完全相关,那就很幸运,您不应该依赖它。 例如,如果驱动程序被更新,则与旧驱动程序关联的所有设备节点都将消失,并且在一段时间后将为新驱动程序创建新的设备节点,并且硬件中根本没有任何变化。 如果特定驱动程序以特定顺序创建其设备节点,这将是稳定的,但仍然不是一个值得依赖的好主意,因为它将是特定于供应商的。
这些 API 为您提供在执行过程中保持一致的标识符。 不要将索引存储到设备列表中,然后在列表顺序更改时出现问题,而是存储用于持久标识的值。