我正在从我的应用程序执行VLC,以从DirectShow音频捕获设备捕获和编码。 VLC通过STDOUT将编码数据发送到我的应用程序。我需要一种方法来枚举DirectShow音频捕获设备。不幸的是,VLC似乎没有为此提供任何非GUI方式。
在寻找获取设备名称列表的简单方法时,我偶然发现了这些注册表项,其中子键以音频捕获设备命名:
HKEY_CURRENT_USER\Software\Microsoft\ActiveMovie\devenum 64-bit\{33D9A762-90C8-11D0-BD43-00A0C911CE86}
HKEY_CURRENT_USER\Software\Microsoft\ActiveMovie\devenum\{33D9A762-90C8-11D0-BD43-00A0C911CE86}
此注册表位置是否保证与其他计算机和最新版本的DirectX位于同一位置?如果没有实现大量的DirectX代码,还有其他方法可以获得DirectShow音频设备名称列表吗? (可能通过诊断工具的某些输出。)
答案 0 :(得分:1)
DirectShow(Windows核心API,不再是DirectX的一部分)设备列表由枚举器提供,列出了特定类别(在这种情况下为音频输入设备,CLSID_AudioInputDeviceCategory
)。这是有问题的GUID
,注册表不一定包含那里所有设备的条目。相反,枚举器通过API以编程方式提供设备列表,组合不同类型的可用设备。
无法以明确定义/记录的方式影响枚举顺序。
枚举设备的最简单方法是Windows SDK GraphEdt.exe工具,或其更好的备用选项GraphStudio / GraphStudioNext。 Ctrl+F
然后选择类别:
您还可以使用EnumerateAudioCaptureFilterCapabilities命令行工具(source code)枚举设备及其功能,其中“友好名称”行按枚举顺序列出设备:
Moniker Display Name: @device:cm:{33D9A762-90C8-11D0-BD43-00A0C911CE86}\Stereo Mix (Realtek High Defini
Friendly Name: Stereo Mix (Realtek High Defini
Pin: Capture
Capability Count: 23
Capability 0:
AM_MEDIA_TYPE:
.bFixedSizeSamples: 1
.bTemporalCompression: 0
.lSampleSize: 4
.cbFormat: 18
WAVEFORMATEX:
.wFormatTag: 1
.nChannels: 2
.nSamplesPerSec: 44100
.nAvgBytesPerSec: 176400
.nBlockAlign: 4
.wBitsPerSample: 16
.cbSize: 0
为了影响订单,例如将设备放在列表顶部,我只能想到API挂钩,这是可能的事情,但由于标准系统行为的改变而不建议广泛使用。< / p>