Windows shell:如何获取音频设备的名称?

4
我不确定这是否严格属于编程问题,只要我不介意使用其他软件来解决问题,并且保持可脚本化或命令行(即非GUI解决方案)。无论如何,我在 SuperUser 上发布了另一个(稍有不同)的问题。顺便说一句,如果我在那里得到答案,我会在这里更新。

我的Windows程序(只是一个shell脚本)调用VLC命令行,以便从音频卡录制音频并将其流式传输出去,例如:

vlc dshow:// :dshow-vdev=none :dshow-adev="SoundMAX HD Audio I" :std{mux=ts,access=http,dst=:8080} :sout-keep [rest of the cmdline not relevant]

只要计算机上有多个音频设备(网络摄像头,多个音频卡,蓝牙设备等),我需要以编程方式获取它们的名称。
到目前为止,我一直使用FFMPEG:
ffmpeg -list_devices true -f dshow -i dummy

...但有时它不能正常工作,例如:

d:\Utils\FFMPEG\bin>ffmpeg -list_devices true -f dshow -i dummy
ffmpeg version N-72460-g11aa050 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.9.2 (GCC)  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmfx --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --ena
ble-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enable-zlib
  libavutil      54. 26.100 / 54. 26.100
  libavcodec     56. 41.100 / 56. 41.100
  libavformat    56. 34.100 / 56. 34.100
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 16.101 /  5. 16.101
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
[dshow @ 0000000000363520] DirectShow video devices (some may be both video and
audio devices)
[dshow @ 0000000000363520] Could not enumerate video devices (or none found).
[dshow @ 0000000000363520] DirectShow audio devices
[dshow @ 0000000000363520] Could not enumerate audio only devices (or none found
).
dummy: Immediate exit requested

命令行工具SystemInfo无法正常工作:
C:\>systeminfo | find "audio" /i

C:\>

regedit中搜索并没有找到我的声卡示例(SoundMAX HD Audio I)。

难道没有其他更可靠的方式可以通过编程方法获取声音设备名称吗?

如果可能的话,我希望获得Windows XP和Vista或更高版本的答案。

进行了其他测试

  • 安装了最新的MicroSoft .NET FrameWork v4.5.2并重新启动。
  • 测试旧版FFMPEG:v4.8(2014)和v4.7(2013)。
  • 测试了UAC提升提示。

我从未遇到过FFmpeg无法列出Directshow设备的情况。我建议尝试切换FFmpeg版本。你可能缺少某个库或其他东西。此外,你可能会在SuperUser.com上找到更好的答案。 - Brad
MSVCRT.DLL... 你尝试重新安装 Visual C++ 运行库了吗?另外,你可以尝试从其他地方获取 FFmpeg 构建。 - Brad
嗨,@Brad,这是我下载FFMPEG的位置(看起来很官方):http://ffmpeg.zeranoe.com/builds/win64/ - Sopalajo de Arrierez
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Sopalajo de Arrierez
1
相同的结果:32位无法列举音频设备。已测试v4.7.3(2013年)和最新版本。 - Sopalajo de Arrierez
显示剩余2条评论
1个回答

2
从上述SuperUser主题中获得的答案(感谢@Karan)。首先,FFMPEG应该返回设备名称值。如果没有,请尝试以下操作:
1. 更新FFMPEG到最新版本。 2. 更新.NET Framework。 3. 尝试另一个版本。请注意,v4.7.3似乎不需要.NET Framework,如果这是问题的原因(从此线程中提取)。 4. 对于麦克风设备,请确保插孔已连接。在某些系统上,如果没有连接,则似乎会禁用(消失)设备。当然,这不适用于带有内置麦克风的便携式设备。
作为第二个选择,仅适用于Vista及以上版本,并且不需要下载30-40MB的FFMPEG,您可以尝试来自NirSoft的SoundVolumeView。将值发送到.txt文件并通过以下方式进行过滤:
SoundVolumeView /scomma Audio.txt
for /f "tokens=1 delims=," %d in ('type Audio.txt ^| find "Capture"') do @echo Default recording device is: "%d"

作为第三个选项,仍适用于Vista及以上系统,可以通过执行以下命令行从注册表中提取所有音频输入(捕获和录制)设备(由@Karan在这里解释):
for /f "tokens=9 delims=\" %a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Capture" /s ^| find "\Properties"') do @for /f "tokens=2*" %k in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Capture\%a\Properties" /v "{a45c254e-df1c-4efd-8020-67d146a850e0},2"') do @echo "%l"

注意:请记住,在编写此类设备的脚本时,您可以找到像西班牙语单词 Micrófono(表示“麦克风”)这样的特殊本地化字符。例如,FFMPEG 会将其显示为一些相当奇怪的 Micrófono
上述三种方法,包括 NirSoft 的方法,在远程控制台(例如 SSH)上都能正常工作。 其他要点:
  • 请注意,此答案仅解决录制/输入/捕获设备的名称问题,因此(也许除了 FFMPEG 的情况),以上方法对于搜索播放设备无效或必须相应修改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接