扫描特定进程的声音
Scan for a sound on a specific process
我想知道是否有一种方法可以在 Java 中扫描预定义过程中的特定卷。如果这个音量超过某个 dB 值,某个 KeyEvent
或 MouseEvent
应该只在这个进程上执行,所以这也可以 运行 在后台。
到目前为止,我还没有在 Java 中看到实现此功能的好方法,所以我也想知道这是否可行以及如何实现。
提前致谢!
基本计划:
- 设置在
SourceDataLine
上播放的声音(不适用于 Clip
)
- 播放时,将字节数据转换为PCM(具体算法取决于音频格式)
- 对 PCM 数据应用 RMS 滤波器算法(查看
root mean square
了解更多信息)
- 如果 RMS 值超过目标值,则发送通知(使用“松耦合”设计模式,阻塞音频播放的风险最小)。
播放时读取SourceDataLine
暴露的数据,查看教程“Using Files and Format Converters”中的第一个例子,代码读取如下:
// Here, do something useful with the audio data that's
// now in the audioBytes array...
就确定什么 RMS 值对应于所需的触发 DB 或响度级别而言,事情会变得相当复杂。音频数据基本上是相对的而不是绝对的,并且 RMS 算法给出的值可以具有不同的“感知”响度,具体取决于声音的频率内容。此 post、How to get the volume level from PCM data 讨论了在此领域中遇到的一些并发症。不过可能是想多了,看你的目的了。
我想知道是否有一种方法可以在 Java 中扫描预定义过程中的特定卷。如果这个音量超过某个 dB 值,某个 KeyEvent
或 MouseEvent
应该只在这个进程上执行,所以这也可以 运行 在后台。
到目前为止,我还没有在 Java 中看到实现此功能的好方法,所以我也想知道这是否可行以及如何实现。
提前致谢!
基本计划:
- 设置在
SourceDataLine
上播放的声音(不适用于Clip
) - 播放时,将字节数据转换为PCM(具体算法取决于音频格式)
- 对 PCM 数据应用 RMS 滤波器算法(查看
root mean square
了解更多信息) - 如果 RMS 值超过目标值,则发送通知(使用“松耦合”设计模式,阻塞音频播放的风险最小)。
播放时读取SourceDataLine
暴露的数据,查看教程“Using Files and Format Converters”中的第一个例子,代码读取如下:
// Here, do something useful with the audio data that's
// now in the audioBytes array...
就确定什么 RMS 值对应于所需的触发 DB 或响度级别而言,事情会变得相当复杂。音频数据基本上是相对的而不是绝对的,并且 RMS 算法给出的值可以具有不同的“感知”响度,具体取决于声音的频率内容。此 post、How to get the volume level from PCM data 讨论了在此领域中遇到的一些并发症。不过可能是想多了,看你的目的了。