Более продвинутые средства управления аудио в Java - PullRequest
1 голос
/ 07 ноября 2010

Мне нужно больше контроля над воспроизведением звуков, чем обеспечивает 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_CONTINUOUSLY);играет только один раз.Может кто-нибудь решить это?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2010

Вам необходимо использовать API JavaSound (классы в пакетах javax.sound. *). Google даст вам несколько учебных пособий по их использованию.

0 голосов
/ 08 ноября 2010

Я должен поддержать ответ jarnbjo, однако документация не очень хорошая. Подход, который я нашел для воспроизведения одного и того же звука более одного раза, выглядит примерно так:

Сначала прочитайте его в байтовый буфер с именем «data»:

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();

А затем воспроизведите звук из этого буфера с именем «data» (столько раз, сколько вам нужно):

line.start();
for (int i=0; i<data.length; i+=BUFSIZE) {
    line.write(data, i, BUFSIZE);
}
line.drain();
line.stop();

Это на самом деле взято с этого форума: http://www.java -forums.org / advanced-java / 16458-playing-audioinputstream-multiple-times.html . Я не проверял это, но это выглядит хорошо для меня. Посмотрите, как далеко вы продвинулись с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...