是否有可能获得Windows7上各个程序的峰值仪表读数?如果可能,如何获得?
使用WASAPI可以通过环回设备捕获整个系统音频,但这不会区分来自不同程序的输出。This question考虑为单个指定的应用程序捕获音频,但当处理捕获所有单独播放音频的程序时,答案似乎令人望而却步。这必须是可能的,因为SndVol可以做到这一点,如下图所示。问题是它是如何实现的?这是通过未公开的API调用完成的吗?或者实际上也可以通过WASAPI实现这样的事情吗?

谢谢。
发布于 2013-01-17 05:05:59
您正在枚举音频会话并获取IAudioSessionControl接口(MSDN code snippet)。缺少的部分是,您可以从已有的IAudioSessionControl查询IAudioMeterInformation接口。
如果音频端点支持峰值计量器,您将能够获得此接口,并将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);发布于 2013-01-14 13:55:45
查看WASAPI,有一个来自给定客户端的interface to capture audio,但我没有看到任何用于确定峰值级别的更高级别的接口。您可能需要编写一些代码来做到这一点,除非有人已经创建了一个库,用于使用此WASPI进行一些更高级别的音频工作。干杯!
发布于 2013-01-17 02:52:33
这是另一个尝试:IChannelAudioVolume::GetChannelVolume。我在SndVol上跟随MSDN上的帖子,这就是我结束的地方。引用自网页:“GetChannelVolume方法在音频会话中检索指定声道的音量级别。”您必须编写一些软件来从该流中提取峰值。我的快速猜测是比较当前值是否大于上一个最大值。如果是,则当前值成为峰值。
干杯!
https://stackoverflow.com/questions/14313692
复制相似问题