java - 如何更改剪辑的分贝

标签 java swing javasound jslider audioinputstream

我遇到的问题是音频文件的分贝仅从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/

相关文章:

java - 向JFrame添加两个JPanel,只有一个可见

java - 计算 Swing 中物体之间可能的路径(可能是无穷大)的策略?

java - paintComponent() 仅在最小化-最大化屏幕时被调用

java - MessageBrokerServlet 与 XmlWebAppInitializer 方法

java - 通过对角遍历具有左倾对角线部分的二维数组来获取数组列表?

java - 使用@Inheritance注释的实体不能使用@AttributeOverride或@AttributeOverrides :

java - 内置点击音

java - 是否可以将字符串转换为音频流来播放字符串内容?

java - 在Java中使用.wav格式循环播放音频文件

java - 文件中的矩阵