java - OpenJDK 更改 Clp 音量

标签 java audio

我正在将代码从 Oracle JDK 导入到 OpenJDK (Java 8)。剩下的唯一需要解决的问题是如何改变 Java Clip (java.sound.sampled.Clip) 的音量?即使经过几个小时的搜索,我也找不到如何更改 Clip 的音量。

使用 Oracle JDK 我这样做了:

FloatControl floatControl = (FloatControl) myClip.getControl(FloatControl.Type.MASTER_GAIN);
floatControl.setValue(myVolume);

我还尝试了 FloatControl.Type.VOLUME 但不支持。

我只想更改剪辑的音量,而不是使用另一个类/包重写整个音频系统。

<小时/>

我的想法是将传入的音频数据与float相乘,这将降低或提高音量。缺点是它可能会很昂贵,因为我需要在播放音频时更改音量,而不是在程序启动时更改一次。

<小时/>

编辑:我想 Clip 的情况并不那么简单,因为没有一个答案或评论。除了易于设置且轻量级的 Clip(因为我可能会同时播放最多 30 个声音)之外,我还能使用什么?

<小时/>

Linux 5.0.0-27 上的 Kubuntu 19.04
OpenJDK 1.8.0_222

最佳答案

我写了AudioCue正是为了这个目的。它是免费的,许可证是 BSD(开源)。 Java-Gaming.org 的许多游戏程序员已经使用它并取得了良好的效果。

它的设置非常严格地遵循 Clip 的 API,但具有额外的功能。它具有实时音量、声像和频率功能,并允许用户播放同一提示的重叠副本。

只有五个类文件,所以非常小。其中,AudioMixer 类的使用是可选的,但如果您同时有 30 个声音,它可能会有所帮助,因为它将所有内容汇集到单个 SourceDataLine,而不是为每个声音运行一个输出行。

我很乐意帮助您进行设置或回答任何问题。

是的,Java为Clip提供的控件是有问题的。至于它们是否被实现,很大程度上取决于所涉及的计算机系统/硬件。而且控件的粒度往往较差,仅更改缓冲区边界处的音量。 AudioCue 将内部音频存储为“CD 质量”.wav,并细化到单个音频帧。

另一个值得考虑的替代方案是 github 项目 TinySound 。这是一个比 AudioCue 更大的项目,但仍然很小,而且运行良好。我不记得它是否有实时音量推子。可能不会。它的主要优点是它可以处理 .ogg 压缩文件。但如果您需要使用压缩,我也许可以提供帮助。

关于java - OpenJDK 更改 Clp 音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57997272/

相关文章:

java - android:不幸的是应用程序已停止错误

java - Xtext 没有从我的 dsl 生成完整的类

c# - 在后台播放提示音

iphone - 在 objective-c 中,从找不到的路径加载sound.wav

iphone - MPMoviePlayerController 中断播放音频

java - 从文本中检测单词边界

java - 在提取的实体列表中查找重复项

c++ - 为什么在 Windows 7 中调用 Beep 功能后听不到任何声音?

android - 将音频从 IP 摄像机流式传输到 android (audiostream.cgi)

java - (Java) 将负短位放入整数