是否有可能获得Windows 7上各个程序的峰值表读数,如果是,如何获得?
使用WASAPI,可以通过环回设备捕获整个系统音频,但这并不区分不同程序的输出。 This question关于为单个指定应用程序捕获音频,但在处理捕获所有单独播放音频的程序时,答案似乎过高。这必须是可能的,因为SndVol可以做到这一点,如下图所示。问题是它是如何完成的?它是通过未暴露的API调用完成的,还是实际上可以通过WASAPI实现这样的事情?
感谢。
答案 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方法检索音频会话中指定频道的音量级别。”您必须编写一些软件才能从此流中提取峰值。我的快速猜测只是比较当前值是否大于最后一个最大值。如果是这样,则当前值成为峰值。
干杯!