gpt4 book ai didi

java - 设置 Java Clip 的音量

转载 作者:行者123 更新时间:2023-11-29 09:47:05 24 4
gpt4 key购买 nike

有什么方法可以设置 Clip 的相应音量吗?在Java

我有这个方法:

public static void play(Clip clip) {
if (Settings.getSettings().isVolumeOn()) {
FloatControl volume = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
volume.setValue(-1 * Settings.getSettings().getVolume());
clip.start();
}
}

Settings.getSettings().getVolume()返回 Integer0 - 100 范围内

Volumes:

  1. 0 : No Sound
  2. 40 : Optimal Sound with headphones
  3. 60 : Optimal Sound
  4. 100: Full Sound

所以基本上这应该像 VLC 的比例(但一半因为 VLC 来自 0 to 200)。

我发现使用 volume.setValue(-10f); 可以降低剪辑的分贝值

但我更喜欢 volume.setValue(clip.getMaxVolume() * Settings.getSettings().getVolume()/100) 类型的东西.

在哪里clip.getMaxVolume()将返回剪辑的最大音量。

最佳答案

MASTER_GAIN FloatControl 值以分贝为单位,这意味着它是对数标度,而不是线性标度。

虽然分贝对于音频专业人士来说非常重要,但我们程序员通常想要一个很好的线性刻度,其中 0.0 是静音,0.5 是半音量,1.0 为全卷;我的意思是声音样本的正常音量。在播放音效时,我们通常不会放大声音片段,只是衰减它们。

Decibel (dB) to Float Value Calculator解释了将分贝转换为线性刻度背后的数学原理,但这里是代码:

Fantom :

using [java] javax.sound.sampled::Clip
using [java] javax.sound.sampled::FloatControl
using [java] javax.sound.sampled::FloatControl$Type as FType

...
private Clip clip

Float volume {
get {
gainControl := (FloatControl) clip.getControl(FType.MASTER_GAIN)
return 10f.pow(gainControl.getValue / 20f)
}
set {
if (it < 0f || it > 1f) throw ArgErr("Invalid volume: $it")
gainControl := (FloatControl) clip.getControl(FType.MASTER_GAIN)
gainControl.setValue(20f * it.log10)
}
}

并转换为Java:

import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;

...

private Clip clip

public float getVolume() {
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
return (float) Math.pow(10f, gainControl.getValue() / 20f);
}

public void setVolume(float volume) {
if (volume < 0f || volume > 1f)
throw new IllegalArgumentException("Volume not valid: " + volume);
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
gainControl.setValue(20f * (float) Math.log10(volume));
}

请注意,不需要涉及 clip.getMaxVolume()clip.getMinVolume(),因为使用上面的代码,音量为 1.0 对应于 0 Db(无变化),音量 0.1 对应于 -20 Db(非常非常安静)。

如果您确实想要放大声音片段,那么没有什么可以阻止您将 2.0 传递给正常音量的两倍,a-la VLC。

作为一个无耻的插件,看看我用这些知识做了什么 - 参见 Escape the Mainframe - 在浏览器中运行并作为桌面 Java 应用程序运行的迷你跳跃游戏。写在Fantom - 玩得开心!

关于java - 设置 Java Clip 的音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40514910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com