是否可以在 Windows 7 上获取单个程序的峰值仪表读数,如果可以,如何获取?
使用 WASAPI 可以通过环回设备捕获整个系统音频,但这并不能区分来自不同程序的输出。这个问题涉及为单个指定应用程序捕获音频,但在处理捕获所有单独播放音频的程序时,答案似乎令人望而却步。这一定是可能的,因为 SndVol 可以做到,如下图所示。问题是它是如何实现的?它是通过未公开的 API 调用来完成的,还是实际上也可以通过 WASAPI 来实现这样的事情?
谢谢。
您正在枚举音频会话并获取IAudioSessionControl
接口(MSDN代码片段)。缺少的部分是您可以查询您已经持有的IAudioMeterInformation
接口。IAudioSessionControl
如果音频端点支持峰值计,您将能够获取此接口,并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 方法检索音频会话中指定通道的音量级别。” 您必须编写一些软件来从该流中提取峰值。我的快速猜测只是比较当前值是否大于上一个最大值。如果是这样,则当前值变为峰值。
干杯!