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

时间:2015-05-31 22:44:02

标签: windows shell audio device

  

我不确定这是否只是一个编程问题,只要我   不介意使用其他软件来解决问题,只要它保持脚本或命令行(这是:一个非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提升提示。

1 个答案:

答案 0 :(得分:0)

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

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

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

作为第二种选择,仅适用于Vista及以上版本(今天,2015年6月),并且不需要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解释here)发出此命令行:

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的西班牙语单词Microphone。例如,FFMPEG会将其显示为一些相当奇怪的Micrófono

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

其他要点

  • 请注意,此答案仅解决录制/输入/捕获设备的音频设备名称问题,因此(可能除了FFMPEG情况除外)上述方法无效或必须相应修改如果你搜索游戏的那些。