我的问题是,音频文件的分贝值仅从programVolume(变量)的初始值更改,但是我有一个JSlider可以更改变量的值;但是,它不会改变文件的分贝值。我要添加/更改哪些内容以确保基于JSlider中为变量设置的值进行分贝更改。
File fileSong = new File (filePath);
AudioInputStream input = AudioSystem.getAudioInputStream(fileSong);
clip = AudioSystem.getClip();
clip.open(input);
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
gainControl.setValue(programVolume);
clip.start();
编辑:
我添加了以下代码:
File fileSong = new File (filePath);
AudioInputStream input = AudioSystem.getAudioInputStream(fileSong);
clip = AudioSystem.getClip();
clip.open(input);
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
float range = gainControl.getMaximum() - gainControl.getMinimum();
float gain = (range * programVolume) + gainControl.getMinimum();
gainControl.setValue(gain);
对于我的JSlider(位于ChangeEvent e方法中)
programVolume = (float)volume.getValue() / 100;
我仍然面临着同样的问题。从JSlider接收到的新值不会更改音量。只有programVolume的初始值会改变声音。
Clip
效率很低。必须重新加载整个Clip
,然后才能重新启动。 通常,控件存在问题,因为它们取决于与不同系统交互的本机代码。一台PC上实现的控件可能由于该PC上缺少的功能而无法在另一台PC上实现。
Math.Log
用于将分贝计算/转换为我们知道的体积系统(0%-100%),所以我认为。 File fileSong = new File (filePath);
AudioInputStream input = AudioSystem.getAudioInputStream(fileSong);
clip = AudioSystem.getClip();
clip.open(input);
clip.setMicrosecondPosition(position);
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
float range = (float) (Math.log(userInput) / Math.log(10) * 20);
gainControl.setValue(range);
clip.start();