我遇到的问题是音频文件的分贝仅从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 的初始值会改变声音。
最佳答案
@gthanop 对 ShaleeQureshi 答案的第一个建议非常重要。重新加载 Clip
效率非常低。整个 Clip
必须重新加载才能重新启动。
控件通常会出现问题,因为这些问题依赖于与不同系统交互的 native 代码。由于该 PC 上缺少功能,在一台 PC 上实现的控件可能无法在另一台 PC 上实现。
出现的另一个问题是控件引起的更改与缓冲区边界相关。例如,如果缓冲区有半秒长,则新值最多需要半秒才能生效。
音频文件本身没有“分贝”控制。相反,音量由形成信号的数据值的动态范围产生。安静的文件的范围可能只有 -0.05 到 0.05,而响亮的文件可能更接近 -0.5 到 0.5。音频文件可能有大声的部分和柔和的部分,但整体仍然直接编码为信号值。 .wav 文件没有“音量”控制。
由于不能依赖Java提供的控件,您可能需要查看github资源AudioCue 。它基本上是一个增强的 Clip
,具有实时音量控制。该代码具有宽松的许可证,可以免费使用或检查想法。基本原理是将数据存储在 float[]
中而不是 Clip
中,并通过 SourceDataLine
播放数据,同时保持常数引用在信号流中乘以信号值的音量因子。
关于java - 如何更改剪辑的分贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59550069/