Windows shell: 如何获取音频设备名称?
Windows shell: How can I get the audio device(s) name(s)?
I am not sure if this is strictly a programming question, as long as I
don't mind to use additional software in order to solve the problem, as long as it keeps being scriptable or command-line (this is: a not GUI solution). Anyway, I have posted another (a bit different) question at SuperUser. By the way, I will update here if I get the answer there.
我的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 提升提示。
从上述超级用户线程获得的答案(感谢@Karan)。
首先,FFMPEG 应该 return 设备名称值。如果没有,请尝试:
- 将 FFMPEG 更新到最新版本。
- 更新 .NET FrameWork。
- 试试 another version. Note that v4.7.3 seems not to be needing .NET Framework, if this were the issue (extracted from this thread).
- 对于麦克风设备,请确保插孔已连接。在某些系统上,如果没有,设备似乎被禁用(消失)。当然,这个不适用于带有嵌入式(内置)麦克风的便携式设备。
作为第二个选项,仅适用于 Vista 及更高版本(截至今天,2015 年 6 月),并且不需要下载 30-40MB 的 FFMPEG,您可以尝试 SoundVolumeView 来自 NirSoft。将值发送到 .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 及更高版本,所有音频输入(捕获和录音)设备都可以从寄存器中提取(here 解释@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)上正常工作。
加分:
- 请注意,此答案仅解决 recording/input/capture 设备的音频设备名称问题,因此(除了 FFMPEG 情况,可能)上述方法无效或如果您搜索正在播放的必须相应修改。
I am not sure if this is strictly a programming question, as long as I don't mind to use additional software in order to solve the problem, as long as it keeps being scriptable or command-line (this is: a not GUI solution). Anyway, I have posted another (a bit different) question at SuperUser. By the way, I will update here if I get the answer there.
我的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 提升提示。
从上述超级用户线程获得的答案(感谢@Karan)。
首先,FFMPEG 应该 return 设备名称值。如果没有,请尝试:
- 将 FFMPEG 更新到最新版本。
- 更新 .NET FrameWork。
- 试试 another version. Note that v4.7.3 seems not to be needing .NET Framework, if this were the issue (extracted from this thread).
- 对于麦克风设备,请确保插孔已连接。在某些系统上,如果没有,设备似乎被禁用(消失)。当然,这个不适用于带有嵌入式(内置)麦克风的便携式设备。
作为第二个选项,仅适用于 Vista 及更高版本(截至今天,2015 年 6 月),并且不需要下载 30-40MB 的 FFMPEG,您可以尝试 SoundVolumeView 来自 NirSoft。将值发送到 .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 及更高版本,所有音频输入(捕获和录音)设备都可以从寄存器中提取(here 解释@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)上正常工作。
加分:
- 请注意,此答案仅解决 recording/input/capture 设备的音频设备名称问题,因此(除了 FFMPEG 情况,可能)上述方法无效或如果您搜索正在播放的必须相应修改。