Windowsshell:如何获取audio设备的名称?

我不确定这是否严格是一个编程问题,只要我不介意使用额外的软件来解决问题,只要它一直保持脚本或命令行(这是:一个不是GUI解决scheme)。 无论如何,我已经在SuperUser上发布了另一个(有点不同的)问题。 顺便说一句,如果我在那里得到答案,我会在这里更新。

我的Windows程序(只是一个shell脚本) 调用VLC命令行logging来自audio卡的audio并将其stream出,如:

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] 

只要计算机上可能有多个audio设备 (networking摄像头,多个audio卡,bluettoth设备等),我需要以编程方式获取它们的名称

直到现在我已经使用了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里面search没有发现我的声卡例子( SoundMAX HD Audio I )。

没有其他更可靠的方式来以编程方式获取声音设备名称?

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

额外的testing

  • 安装最新的MicroSoft .NET FrameWork v4.5.2&重新启动。
  • testing旧版本的FFMPEG:v4.8(2014)和v4.7(2013)。
  • 经testingUACboost提示。

Solutions Collecting From Web of "Windowsshell:如何获取audio设备的名称?"

从上面提到的SuperUser线程获得答复(感谢,@ Karan)。

首先, FFMPEG应该返回设备名称值。 如果不是,请尝试:

  • 更新FFMPEG到最新版本。
  • 更新.NET FrameWork。
  • 尝试另一个版本 。 请注意,v4.7.3似乎不需要.NET Framework,如果这是问题(从此线程提取)。
  • 对于麦克风设备,确保插孔已连接。 在某些系统上,似乎设备被禁用(消失),如果没有。 当然,这不适用于嵌入式(内置)麦克风的便携式设备。

作为第二种选择,只适用于Vista及以上版本(截至今天,2015年6月),而不需要FFMPEG的30-40MB下载,您可以试用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" 

注意:请记住,在编写这些设备的脚本时,您可以找到特殊的本地化字符 ,例如Microphone的西班牙语单词Micrófono 。 例如,FFMPEG会显示它是一些相当奇怪的Micrófono

所有上述三种方法,包括NirSoft,都可以在远程控制台 (例如SSH)上正常工作。

其他要点

  • 请注意,这个答案仅解决了录音/输入/捕捉设备的音频设备名称问题,所以(除了FFMPEG情况,也许)上述方法无效或必须相应地修改,如果您搜索播放的。