Windows 7上各个程序的峰值计

时间:2013-01-14 05:29:55

标签: windows audio wasapi

是否有可能获得Windows 7上各个程序的峰值表读数,如果是,如何获得?

使用WASAPI,可以通过环回设备捕获整个系统音频,但这并不区分不同程序的输出。 This question关于为单个指定应用程序捕获音频,但在处理捕获所有单独播放音频的程序时,答案似乎过高。这必须是可能的,因为SndVol可以做到这一点,如下图所示。问题是它是如何完成的?它是通过未暴露的API调用完成的,还是实际上可以通过WASAPI实现这样的事情?

enter image description here

感谢。

3 个答案:

答案 0 :(得分:12)

您正在枚举音频会话并获取IAudioSessionControl接口(MSDN code snippet)。缺少的部分是您可以从您已经持有的IAudioMeterInformation查询IAudioSessionControl接口。

如果音频端点支持峰值表,您将能够获得此接口,并使用IMeterInformation::GetPeakValue进行单个会话。这就是SndVol所说的。

这是piece of code that does the thing

CComPtr<IAudioSessionControl> pSessionControl;
...
CComQIPtr<IAudioMeterInformation> pMeterInformation = pSessionControl;
FLOAT fPeakValue;
pMeterInformation->GetPeakValue(&fPeakValue);
_tprintf(_T("nSessionIndex %d, fPeakValue %.2f\n"), nSessionIndex, fPeakValue);

答案 1 :(得分:0)

查看WASAPI,来自给定客户端的interface to capture audio,但我没有看到任何更高级别的界面来确定峰值水平。您可能需要编写一些代码来执行此操作,除非有人创建了一个库以使用此WASPI执行更高级别的音频工作。干杯!

答案 2 :(得分:0)

以下是另一个镜头:IChannelAudioVolume::GetChannelVolume。我从SndVol跟踪MSDN上的线程,这就是我最终的结果。从网页引用:“GetChannelVolume方法检索音频会话中指定频道的音量级别。”您必须编写一些软件才能从此流中提取峰值。我的快速猜测只是比较当前值是否大于最后一个最大值。如果是这样,则当前值成为峰值。

干杯!