扫描特定进程上的声音



我想知道是否有一种方法可以在Java中扫描预定义进程中的某个卷。如果此卷超过某个dB值,则应该只在该进程上执行某个KeyEventMouseEvent,因此该进程也可以在后台运行。到目前为止,我还没有看到在Java中实现这一功能的好方法,所以我也想知道这是否可能以及如何可能。提前感谢!

基本方案:

  • 设置声音在SourceDataLine上播放(将无法为Clip工作)
  • 在播放过程中,将字节数据转换为PCM(确切的算法将取决于音频格式)
  • 对PCM数据应用RMS滤波算法(查看root mean square了解更多信息)
  • 如果RMS值超过目标值,则发送通知(使用"松耦合";以最小的风险阻塞音频播放的设计模式)。

要读取SourceDataLine在播放期间公开的数据,请查看教程中的第一个示例"使用文件和格式转换器",代码读取以下内容:

// Here, do something useful with the audio data that's 
// now in the audioBytes array...

至于确定哪个RMS值对应于所需的触发DB或响度级别,事情可能会变得相当复杂。音频数据基本上是相对的,而不是绝对的,均方根算法给出的值可能有不同的"感知"值。响度取决于声音的频率内容。这篇文章《如何从PCM数据中获得音量级别》讨论了在这个领域中遇到的一些复杂问题。但也许你想得太多了,这取决于你想要什么。

最新更新