0

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

  • 音频设备
  • 高级播放器

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

干杯蒂莫西

4

2 回答 2

2

最简单的方法是通过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,请阅读此处

于 2013-07-10T12:36:39.587 回答
0

JLGUI 是基于 UI 的 JLayer 应用程序调整音量的一个很好的例子。您可以在 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);
        }
    }
于 2010-06-28T16:30:29.290 回答