小科普 | 不同音频API有什么区别?DirecSound/WaveOut/Wasapi我该怎么选?

经常玩HiFi音频的朋友们,为了追求听感甚至心理上的机制(强迫症),可能经常被“压缩格式、比特率、采样率”折腾,在Windows下听歌你甚至需要了解输出模式(API接口)
 

比方说打开个音频软件,在输出设备里,你总能看到“DirecSound、WaveOut、Wasapi”这三种模式。他们有什么区别,我们今天就来聊聊这个话题。
 
▌MME
 
相对最早的是WaveOut,与之对应的还有WaveIn(和midi、mixer、aux),都属于MME API(WinMM)当中的通用音频API(FP32样本),MME全称MutiMediaExtensions多媒体扩展技术。
 

它于1991年发布,从Windows 3.0开始支持应用程序和多媒体播放,目前已经属于Windows旧版音频组件了,老东西兼容性自然是最好的。
 

早期不支持“混和多音频流”,需要声卡驱动模拟多MME设备实现,从Win95完善到Vista。已经支持多音频流混合,最高每秒384000采样率、8通道、32个接口。
 

它无法直连硬件,需要通过层层接口才能访问硬件,导致延迟较高,缓冲区不够声音会断断续续,因此最小可接受延迟约120ms(其中KMixer混音器最低30ms)…也不支持硬件加速,只能软解吃CPU,如果CPU吃不消就会爆音断音。
 
 
 
▌DirectSound
 
由于1994年的Win95老API的多媒体函数响应太慢,很多程序员都偏向于在能硬件直连的DOS上编写游戏,于是1995年9年微软推出了革命性的DirectX API,其中包含目前主流的DirectSound(DS)。优势就是延迟相对更低,支持声卡硬件加速,但并非面对专业音频需求。
 

 
▌KS
 
期间还有个Windows Driver Module(WDM)解决对多音频流和延迟问题,作用的对象不是应用程序,而是驱动本身,能大幅降低延迟,堪比ASIO。
 
 
Direct组件中也包含了Kernel Streaming(KS)内核流式处理,于Windows 98中引入(Stream.sys),绕过KMixer混音器和Windows音量控制器,提供硬件级访问,实现更低的延迟。缺点是只有输出没有输入,用不了麦克风,纯独占下你听歌就听不到其他声音。
 
 
▌WASAPI
 

不过到了2006年11月,从VISTA开始,微软放弃了DS3D硬件支持(HAL),打算重写整套音频架构,提出了Universal Audio Architechture(UAA)通用音频架构,其中新增的就是WASAPI了,
 

全称Windows Audio Session API,可以对每组音频单独处理,避免SRC采样率转换导致的失真(早期Android设备必然遇到的重采样问题,也是“安卓音质不如苹果”的系统因素之一,因为谷歌强制48kHz)。无法修改音频数据,所以音效什么都是用不了的,可以理解为“直出”。
 
使用独占模式(Exclusive Mode),同期intel和微软合作,更新了芯片组上的HPET高精度时钟,代替PIT/RTC,降低总线延迟,实现更低的音频输出总延迟
 

WASAPI也有共享模式(Shared Mode),比方说网易云的WASAPI就是,因此音质其实和DS没任何区别,仅仅是音量调整什么的变成软件独立控制了(变响一些)
 
 
▌ASIO
 
折腾过Foobar2000的老玩家,可能还知道ASIO插件,全称Audio stream input output,由德国Steinberg公司所提出的(声卡公司,后被YAMAHA收购)。输入输出延迟最低降到10ms内,也能避开系统SRC重采样、音效、规格化(响度均衡)处理。
 

效果和WASAPI差不多,所以老系统不支持WASAPI的话可以自行安装ASIO驱动(ASIO4ALL)。缺点是由于需要系统和播放软件都支持才能用,兼容性一般。
 
 
总结
 
此外还有DirectMusic、EAX、OPENAL等诸多音频API,其实不难发现,①音质的好坏和用什么播放器软件没关系,②独占模式才有延迟低、避免SRC失真的优势。
 

发表评论

您的电子邮箱地址不会被公开。