对系统播放出来的声音进行录音是一个比较常见的需求,比如各类直播工具,就会把主播的声音经过麦克风采集下来,再与电脑里播放的音乐合成(也就是混音),再推送到CDN,分发给观众;再比如屏幕录制也希望能够同时录制系统的声音输出。
微软提供的Core Audio APIs中的WASAPI即是用来实现这一功能的。
先看这个https://docs.microsoft.com/zh-cn/windows/win32/coreaudio/core-audio-apis-in-windows-vista
大意是说从windows vista开始提供的这套接口,它为更高层次的接口如DirectSound和waveXxx提供基石,开放出来满足更低层的开发。
再看这个关于WASAPI的介绍:https://docs.microsoft.com/zh-cn/windows/win32/coreaudio/wasapi?redirectedfrom=MSDN
大意是说WASAPI使得客户端的应用能够在应用与音频端点设备之间管理音频数据流,头文件Audioclient.h和Audiopolicy.h给出了WASAPI接口的定义。
再看这个https://docs.microsoft.com/zh-cn/windows/win32/coreaudio/capturing-a-stream
讲到了客户端调用IAudioCaptureClient接口从端点缓冲中读取捕捉的数据,可以用共享模式或独占模式。介绍了IAudioClient和IAudioCaptureClient这两个接口的一些方法的使用。并且附带了一个例子,是从默认的采集设备录制音频流的,如果要捕捉声卡输出的音频流,需要将eCapture改为eRender。
再看这个关于Loopback Recording的https://docs.microsoft.com/zh-cn/windows/win32/coreaudio/loopback-recording
在loopback模式下,WASAPI客户端能够捕捉正在被渲染端点设备播放的音频流,如何以loopback模式打开一个流。
最后提一下用到该项技术的开源软件OBS:https://github.com/obsproject/obs-studio
具体源码参考插件win-wasapi的实现。
此外还有两处文章值得参考: