使用JLayer调整音量

我和一个朋友正在编写MP3播放器作为学校项目。 我们差不多完成了,现在我们试图编写一个函数来改变播放器的音量。 我们正在使用:

  • 音频设备
  • AdvancedPlayer

我知道其他人已经问了同样的问题,但我没有完全得到解决方案,我不想回答这么老的问题,所以我想我会再问一次。

干杯蒂莫西

最简单的方法是通过mp3spi使用jlayer,这基本上意味着你通过JavaSound使用jlayer。 然后,您可以像在JavaSound中那样在线上设置增益。

首先,您需要将以下内容添加到类路径中:

  • jl1.0.1.jar
  • mp3spi1.9.5.jar
  • tritonus_share.jar

…所有这些都在mp3spi的分发中(上面链接)。

其次,您需要在播放之前解码AudioInputStream。

AudioInputStream audioStream = AudioSystem.getAudioInputStream(file); AudioFormat baseFormat = audioStream.getFormat(); AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 16, baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat.getSampleRate(), false); AudioInputStream audioStream2 = AudioSystem.getAudioInputStream(decodedFormat, audioStream); 

然后你播放解码的流:

 Clip clip = AudioSystem.getClip(); clip.open(audioStream2); 

和JavaSound API控件可用:

 FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); gainControl.setValue(-30.0f); 

注意:不要忘记关闭资源,我刚刚展示了这个问题的关键点 – 预计熟悉JavaSound, 请阅读此处 。

JLGUI是基于UI的JLayer app调整音量的一个很好的例子。 您可以在tar.gz文件中获取源代码。 http://www.javazoom.net/jlgui/sources.html

  if (src == ui.getAcVolume()) { Object[] args = { String.valueOf(ui.getAcVolume().getValue()) }; String volumeText = MessageFormat.format(ui.getResource("slider.volume.text"), args); ui.getAcTitleLabel().setAcText(volumeText); try { int gainValue = ui.getAcVolume().getValue(); int maxGain = ui.getAcVolume().getMaximum(); if (gainValue == 0) theSoundPlayer.setGain(0); else theSoundPlayer.setGain(((double) gainValue / (double) maxGain)); config.setVolume(gainValue); } catch (BasicPlayerException ex) { log.debug("Cannot set gain", ex); } }