如何更改剪辑的分贝

问题描述 投票:1回答:2

我的问题是,音频文件的分贝值仅从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的初始值会改变声音。

java swing javasound jslider audioinputstream
2个回答
1
投票
@ gthanop对ShaleeQureshi的回答的第一个建议非常重要。重新加载Clip效率很低。必须重新加载整个Clip,然后才能重新启动。

通常,控件存在问题,因为它们取决于与不同系统交互的本机代码。一台PC上实现的控件可能由于该PC上缺少的功能而无法在另一台PC上实现。


0
投票
我想通了!每当使用JSlider更改变量时,都必须停止剪辑,并将其停止的点存储到变量中。我选择了一个很长的片段,然后必须重新启动该剪辑,当它重新启动时,它将使用用户选择的新音量,并且在它消失的同时开始播放,给用户一种幻想,即在音频播放时音量已更改。文件停止播放,更改音量并恢复播放时正在播放。 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();

© www.soinside.com 2019 - 2024. All rights reserved.