0

我目前正在学习如何使用 jlgui 构建一个简单的 MP3 播放器(使用 swt 来控制它)。虽然我相处得很好,但有一件事真的让我很震惊,那就是控制从计算机发出的声音的音量和声像。

我有一个类,它创建一个 BasicPlayer 对象和一个与之配套的 BasicController。我曾尝试使用 BasicController.setGain 方法,但如果我在其中输入任何值,它所做的只是将音量设置为静音,而且我似乎无法在歌曲播放期间更改此值。如果有人能在这方面给我一些帮助,我将不胜感激,因为它让我发疯:-(

还考虑尝试以下建议

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("C:\\Kasabian.mp3"));
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);

但不确定如何将它与 jlgui 结合使用。

4

1 回答 1

0

“自己动手”解决方案:

Java 声音教程在“使用控件处理音频”页面的末尾有一个非常少的部分,称为“直接操作音频数据”。 http://docs.oracle.com/javase/tutorial/sound/controls.html

我放弃了“控制”,只做自己。如果有人有一个使用 Java 控件进行音量和平移的有效解决方案,我会很高兴听到它。

要自己控制音量,您需要进入从 AudioInputLine 读取的数据“缓冲区”,将数据转换为 PCM 帧,将 PCM 值乘以 1 的分数(其中 1.0 是全音量,0 是沉默),转换回字节,然后,最后,写入您的 SourceDataLine。

此外,(如果您还不气馁),如果体积变量是松散耦合且易失的,它会有所帮助,如果您指定的体积是“目标”并且缓冲区循环内的变量逐渐接近目标,则更有帮助以每帧为基础。这是为了避免可能产生点击的音量跳跃。

并且(如果这还不够的话)将 0 到 1.0 的范围映射到更好地匹配可听度级别的方程(例如,指数或对数)是有帮助的。

于 2013-02-03T22:28:10.427 回答