记得前面说到使用PortAudio抓取声卡输出音频,通过PortAudio确实可以实现,但是我研究发现无法基于PortAudio使用Wasapi抓取计算机输出音频,PortAudio只能使用Wasapi抓取麦克风的输入音频,而不能抓取计算机播放的声音。
先说下PortAudio如何抓取声卡输出:
1)条件:不开启立体声混音。首先我们要枚举所有设备,然后获取各个设备信息,得到设备的HostApiType,代码实现如下:
1 |
int iApiType = Pa_GetHostApiInfo(Pa_GetDeviceInfo(deviceIndex)->hostApi)->type; |
在上述代码中我们传入设备Index参数获取HostApi类型,PortAudio中定义的HostApi有如下几种类型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
typedef enum PaHostApiTypeId { paInDevelopment=0, /* use while developing support for a new host API */ paDirectSound=1, paMME=2, paASIO=3, paSoundManager=4, paCoreAudio=5, paOSS=7, paALSA=8, paAL=9, paBeOS=10, paWDMKS=11, paJACK=12, paWASAPI=13, paAudioScienceHPI=14 } PaHostApiTypeId; |
通过枚举所有设备我们获取ApiType为paWDMKS的设备,并且该设备的maxInputChannels参数不能为0,接下来在Pa_OpenStream函数传入的参数中设置该设备为目标设备即可,在回调函数中实现录音即可抓取计算机输出的音频,即Capture what we hear from the speaker.
2)开启立体声混音。同样要枚举所有设备,这次我们要获取ApiType为paWASAPI的设备,该设备的maxInputChannels参数不能为0(不开启立体声混音只有麦克风满足这两个条件),而且通过Pa_GetDeviceInfo( deviceIndex )->name获取到的设备名不能含有麦克风字样,最后按前面所说方法传入该设备Index即可抓取音频。
真正通过Wasapi 抓取音频是无所谓开不开启立体声混音的,通过Wasapi捕获音频有个条件是被捕获的设备要工作在loopback模式下,可以看下MSDN上的这篇文章:Loopback Recording。
通过Wasapi如何捕获音频,微软给出了示例代码:https://code.msdn.microsoft.com/windowsapps/Windows-Audio-Session-22dcab6b#content。由于我的系统不是win8,VS版本达不到要求,故没去编译这个示例代码。
这个链接是微软员工写的通过Wasapi捕获音频代码:http://blogs.msdn.com/b/matthew_van_eerde/archive/2014/11/05/draining-the-wasapi-capture-buffer-fully.aspx。这个代码确实可以捕获输出音频。
文章评论