Java中更高级的音频控件

Java中更高级的音频控件,java,audio,Java,Audio,我需要比java.applet.AudioClip提供的对播放声音的更多控制。所有这些都提供了播放、循环播放和停止音频剪辑的功能。我想知道如何控制它在哪个扬声器上播放,声音的音量是多少,播放声音的哪个部分,等等。是否有人有任何经验或建议想要分享 编辑: 我已经实现了javax.sound。以下是我的代码的简化版本: public class Clazz extends JFrame { public java.net.URL alertSoundURL = getClass().getRe

我需要比
java.applet.AudioClip
提供的对播放声音的更多控制。所有这些都提供了播放、循环播放和停止音频剪辑的功能。我想知道如何控制它在哪个扬声器上播放,声音的音量是多少,播放声音的哪个部分,等等。是否有人有任何经验或建议想要分享

编辑:
我已经实现了
javax.sound
。以下是我的代码的简化版本:

public class Clazz extends JFrame
{
  public java.net.URL alertSoundURL = getClass().getResource("/resources/beep.wav");
  javax.sound.sampled.Clip timeUp;

  public Clazz()
  {
    try
    {
      javax.sound.sampled.AudioInputStream audioIn = javax.sound.sampled.AudioSystem.getAudioInputStream(alertSoundURL);
      timeUp = javax.sound.sampled.AudioSystem.getClip();
      timeUp.open(audioIn);
      timeUp.setLoopPoints(0, 10000);
      timeUp.start();
      timeUp.stop();
    }
    catch (Throwable t)
    {
      //Tell user sound may not work
    }
  }

  private void setOffAlarm()
  {
    alarmDialog.setSize(alarmDialog.getPreferredSize());
    FrameAction.center(alarmDialog);
    alarmDialog.setVisible(true);
    timeUp.loop(timeUp.LOOP_CONTINUOUSLY);
    newDay = false;
  }
}

我的问题是timeUp.loop(timeUp.loop\u连续);只玩一次。有人能解决这个问题吗?

您需要使用JavaSound API(javax.sound.*包中的类)。谷歌会给你一些关于如何使用它们的教程。

我必须支持jarnbjo的答案,但是文档不是很好。我发现多次播放同一声音的方法如下:

首先将其读入名为“data”的字节缓冲区:

byte[]数据;
InputStream in=ClassLoader.getSystemResourceAsStream(文件名)//在小程序中
AudioInputStream ais=AudioSystem.getAudioInputStream(in);
数据=新字节[(int)ais.getFrameLength()*format.getFrameSize()];
字节[]buf=新字节[BUFSIZE];
for(int i=0;i=data.length){
r=数据长度-i;
}
系统阵列副本(buf,0,数据,i,r);
}
ais.close();
然后播放名为“data”(数据)的缓冲区中的声音(任意次数):

line.start();

对于(inti=0;我尝试过,但是Clip.loop(intcount);命令不起作用;它只循环一次。
byte[] data;
InputStream in = ClassLoader.getSystemResourceAsStream(filename); //in an applet
AudioInputStream ais = AudioSystem.getAudioInputStream(in);
data = new byte[(int)ais.getFrameLength() * format.getFrameSize()];
byte[] buf = new byte[BUFSIZE];
for (int i=0; i<data.length; i+=BUFSIZE) {
    int r = ais.read(buf, 0, BUFSIZE);
    if (i+r >= data.length) {
        r = data.length - i;
    }
    System.arraycopy(buf, 0, data, i, r);
}
ais.close();
line.start();
for (int i=0; i<data.length; i+=BUFSIZE) {
    line.write(data, i, BUFSIZE);
}
line.drain();
line.stop();