Windows 7上个别程序的峰值计数器

是否有可能在Windows 7上获得个别程序的峰值读数,如果是这样,怎么办?

使用WASAPI,可以通过回送设备捕获整个系统audio,但是这不区分来自不同程序的输出。 这个问题涉及捕获单个指定应用程序的audio,但是当处理捕获正在单独播放audio的所有程序时,答案似乎是过分的。 这一定是可能的,因为SndVol可以做到这一点,如下图所示。 问题是如何完成? 是通过未暴露的API调用完成的,还是实际上可以通过WASAPI实现类似的function?

在这里输入图像说明

谢谢。

Solutions Collecting From Web of "Windows 7上个别程序的峰值计数器"

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

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

这是一个代码,做这件事情 :

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

看看WASAPI,有一个接口可以捕获给定客户端的音频 ,但是我没有看到任何更高层次的接口来确定峰值电平。 你可能需要编写一些代码来做到这一点,除非有人创建了一个库来做这个WASPI的高级音频工作。 干杯!

这是另一个镜头: IChannelAudioVolume :: GetChannelVolume 。 我从SndVol的MSDN跟踪了这个线程,而这正是我结束的地方。 从网页引用:“GetChannelVolume方法检索音频会话中指定通道的音量级别”。 你将不得不编写一些软件来从这个流中提取峰值。 我的猜测只是为了比较当前值是否大于最大值。 如果是这样,那么当前值就成为峰值。

干杯!