简体   繁体   中英

how to play wav file in java 1.4

作为标题如何在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... ¯\\_(ツ)_/¯

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM