gpt4 book ai didi

java - 如何更改剪辑的分贝

转载 作者:行者123 更新时间:2023-11-30 01:42:13 24 4
gpt4 key购买 nike

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

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