来源说明:本文参考 ahkscript 维护的 VistaAudio 项目、Vista Audio Control Function Reference 文档整理。原库作者为 Lexikos。本站已有一些 VA 音频控制示例,这篇主要作为总览:告诉你 VistaAudio 能控制什么、函数怎么选、常见坑在哪里。

VistaAudio 常见文件名是 VA.ahk,它封装的是 Windows Vista 以后引入的 Core Audio 接口。用它可以控制默认播放设备音量、静音状态、录音设备音量、音频设备名称、音频峰值表、默认音频输出设备,以及更底层的音频会话接口。

一、它和 SoundSet / SoundGet 有什么区别

AHKv1 自带 SoundSetSoundGet,但它们在现代 Windows 上有不少限制。VistaAudio 的优势是直接面向 Core Audio API,能覆盖更多 Vista 以后系统里的音频控制能力。

简单理解:

  • 只想临时调系统音量:自带命令可能够用。
  • 要稳定控制默认播放/录音设备:用 VistaAudio 更合适。
  • 要获取音频峰值、判断电脑是否正在发声:用 VA_GetAudioMeter 相关接口。
  • 要切换默认输出设备:用 VA_SetDefaultEndpoint,但要注意它依赖未公开接口。
  • 要控制指定程序音量:通常要用音频会话相关接口,复杂度会高一些。

二、最常用:获取和设置主音量

默认情况下,VA_GetMasterVolume()VA_SetMasterVolume() 操作的是默认播放设备。返回和设置的音量范围是 0.0100.0

#Requires AutoHotkey v1.1
#NoEnv
#SingleInstance Force
#Include %A_ScriptDir%\VA.ahk

volume := VA_GetMasterVolume()
MsgBox, % "当前默认播放设备音量:" Round(volume, 1)

VA_SetMasterVolume(30)
return

如果要分别读取左右声道,可以传入声道序号。声道从 1 开始,不是从 0 开始。

Loop % VA_GetMasterChannelCount()
{
    msg .= "声道 " A_Index ": " VA_GetMasterVolume(A_Index) "`n"
}
MsgBox, % msg

三、静音和取消静音

静音状态使用 VA_GetMasterMute()VA_SetMasterMute()。返回值为真表示已静音。

isMute := VA_GetMasterMute()
VA_SetMasterMute(!isMute)

ToolTip, % isMute ? "已取消静音" : "已静音"
SetTimer, HideTip, -1000
return

HideTip:
ToolTip
return

这类脚本很适合绑定到热键、鼠标侧键、托盘菜单、键盘旋钮,也适合做成一个小型音量面板。

四、播放设备和录音设备怎么指定

很多 VistaAudio 函数都有 device_desc 参数。文档里给出的形式包括:

  • playback:默认播放设备。
  • capture:默认录音设备。
  • playback:1:第一个播放设备。
  • nvidia:2:名称包含 nvidia 的第二个设备。
  • 设备 ID 或设备指针。
playbackVol := VA_GetMasterVolume("", "playback")
captureVol := VA_GetMasterVolume("", "capture")
lineoutVol := VA_GetMasterVolume("", "Line Out")

MsgBox, % "播放设备:" playbackVol
    . "`n录音设备:" captureVol
    . "`nLine Out:" lineoutVol

注意,设备名称和声卡驱动、系统语言、蓝牙设备名称有关,不同电脑上不一定一样。写给别人用的脚本,最好先枚举设备或提供配置项,不要把自己的设备名写死。

五、判断电脑是否正在发声

VA_GetAudioMeter() 可以拿到音频峰值接口,用来读取当前播放或录音设备的峰值。站内已有相关示例,这里给出最小思路:循环取峰值,峰值大于某个阈值就认为正在发声。

audioMeter := VA_GetAudioMeter()

Loop
{
    VA_IAudioMeterInformation_GetPeakValue(audioMeter, peakValue)
    ToolTip, % "当前峰值:" Round(peakValue, 3)
    Sleep, 100
}

这类脚本可以用于“电脑有声音时不执行某动作”“检测视频是否还在播放”“做一个简易音量电平条”。不过要记住,峰值是瞬时值,实际判断最好连续采样几次,而不是只看某一瞬间。

六、切换默认音频设备

VA_SetDefaultEndpoint(device_desc, role) 可以设置默认音频端点。文档里说明角色值有三个:

  • 0:eConsole,也就是 Windows 里常说的默认设备。
  • 1:eMultimedia。
  • 2:eCommunications,也就是默认通信设备。
; 将名称中包含 Speakers 的设备设为默认播放设备
VA_SetDefaultEndpoint("Speakers", 0)

; 将名称中包含 Headset 的设备设为默认通信设备
VA_SetDefaultEndpoint("Headset", 2)

这个函数很实用,但文档也提醒:它依赖未公开接口,所以不能保证所有系统版本都稳定可用。做正式工具时,最好给用户保留手动选择和失败提示。

七、控制子单元:麦克风、Line In 等

VA_GetVolumeVA_SetVolumeVA_GetMuteVA_SetMute 面向的是设备里的 subunit,也就是子单元。例如 Line、Line In、Mic 等。这里的名称非常依赖声卡驱动,不同机器差异很大。

lineInVol := VA_GetVolume("Line")
micMute := VA_GetMute("Mic", "capture")

MsgBox, % "Line 音量:" lineInVol "`nMic 是否静音:" micMute

如果查不到,不一定是脚本错了,可能是目标设备没有暴露这个名字,或者驱动把它叫成了别的名称。先枚举设备和子单元,再写控制逻辑,会比直接猜名字稳。

八、接口指针要释放

VistaAudio 的高级函数可能返回 COM 接口指针,例如 VA_GetAudioEndpointVolumeVA_GetAudioMeterVA_GetDevice。文档里多次提醒:不再使用时要 ObjRelease(pointer)

device := VA_GetDevice("playback")
name := VA_GetDeviceName(device)
MsgBox, % "默认播放设备:" name
ObjRelease(device)

短脚本偶尔忘记释放不一定马上出事,但常驻脚本、循环检测、音频面板这类工具最好养成释放习惯。

九、常见坑

  • 设备名不要写死,蓝牙耳机、显示器音频、虚拟声卡名称经常变化。
  • 录音设备用 capture,播放设备用 playback,不要混用。
  • 音量范围是 0.0100.0,不是 0 到 1。
  • 峰值检测需要连续采样,不要只看一次。
  • VA_SetDefaultEndpoint 很方便,但底层不是正式公开 API,失败时要有提示。
  • 高级接口返回指针时,记得 ObjRelease

站内延伸

总的来说,VistaAudio 最适合做“系统音频控制层”的脚本:调音量、静音、检测发声、切换设备、读取设备信息。它不是播放音乐的库,也不是音频处理库,而是帮 AHK 操作 Windows 音频设备和音频接口。

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。