【问题标题】:multiple playback volume within one java runtime一个 Java 运行时内的多个播放音量
【发布时间】:2026-02-19 01:25:01
【问题描述】:

我正在寻找以下问题的解决方案:

  • 我的 java 运行时中有多个包可能会产生音频输出。
  • 用户应该能够只通过一个滑块来控制所有捆绑包的音量(在此之前,我可以使用AudioSystem.getMixer() 来获得 Windows 主音量控制)
  • 有一个包可以创建不受上面滑块影响的重要音频输出。

如前所述,目标环境是 windows(XP 或更高版本)。

不幸的是,所有音频输出包共享相同的进程 ID,因为它们属于相同的 java 运行时。出于这个原因,windows 只会创建一个特定于应用程序的混音器。你有什么想法吗?

【问题讨论】:

  • 什么“捆绑”? “提前致谢!” 不客气!但请不要在未来用陈词滥调浪费空间。
  • OSGi 包。看看osgi.org/Main/HomePage

标签: java windows audio volume


【解决方案1】:

您是通过 Clips 播放的吗?源数据线?很可能,每个都公开了一个可用于更改音量的控件。通过基本的生产者/消费者设计模式,您可以选择哪些声音受 JSlider 影响。

换句话说,您可以在 Clip/SDL 级别而不是在混音器级别进行操作。

如果音量控制不起作用,创建一个浮动“音量”变量并不难,您可以“订阅”或公开给 JSlider,该变量包含 0 到 1.0f 之间的值并将其相乘到 SourceDataLine 播放之前内部缓冲区循环中的每个帧值。它可能需要将字节放在一起(对于 16 位声音),进行乘法运算,然后再将它们分开。这里还有其他线程展示了小端或大端声音数据处理的编码。

我看了一眼提供的 OSGi 链接就跑了。我主要是直接做 javax.sound.sampled 。

如果第三方为声音提供的“捆绑包”没有公开音量控制,我会感到非常惊讶。这似乎是一个基本的东西!

【讨论】:

    最近更新 更多