开发者

how to play wav file in java 1.4

as title How can i play a sound file repeatedly in java v1开发者_运维百科.4?


If you just want to play the wav file then 'org.life.java''s answer is correct. For other format types you can use JMF( http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140239.html ).

Note: JMF is obsolete now... But it will work with jdk 1.4


import java.net.URL;
import javax.sound.sampled.*;

public class LoopSound {

  public static void main(String[] args) throws Exception {
    URL url = new URL(
      "http://pscode.org/media/leftright.wav");
    Clip clip = AudioSystem.getClip();
    AudioInputStream ais = AudioSystem.
      getAudioInputStream( url );
    clip.open(ais);
    clip.loop(0);
    javax.swing.JOptionPane.
      showMessageDialog(null, "Close to exit!");
  }
} 


This will work in JDK 1.4 (tested in Windows XP and JDK 1.4.2_06). The other answer fails because as correctly stated in the comments, AudioSystem.getClip() does not exist on JDK 1.4. Below is a complete source (in the form of a main function, but it's adaptable to anything else) that uses DataLine and plays in a separate Thread for better overall performance as well:

import java.io.File;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;

public class AudioTest {

  public static void main(String[] args) throws Exception {
    AudioInputStream ais = AudioSystem.getAudioInputStream(new File("C:/sound1.wav"));

    AudioFormat format = ais.getFormat();
    DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, format);
    SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);

    class PlayThread extends Thread {
      private AudioInputStream ais;
      private AudioFormat format;
      private SourceDataLine sourceDataLine;

      byte tempBuffer[] = new byte[10000];

      public PlayThread(AudioInputStream ais, SourceDataLine sourceDataLine, AudioFormat format) {
        this.ais = ais;
        this.sourceDataLine = sourceDataLine;
        this.format = format;
      }

      public void run() {
        try {
          sourceDataLine.open(this.format);
          sourceDataLine.start();

          int cnt;
          while ((cnt = this.ais.read(tempBuffer, 0, tempBuffer.length)) != -1) {
            if (cnt > 0) {
              sourceDataLine.write(tempBuffer, 0, cnt);
            }
          }

          sourceDataLine.drain();
          sourceDataLine.close();

        } catch (Exception e) {
          throw new RuntimeException(e);
        }
      }
    }

    new PlayThread(ais, sourceDataLine, format).start();

  }
}

Both question and answers are really old, but I just had to make this work on a fanless mini PC that only run windows XP so... ¯\_(ツ)_/¯

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜