簡體   English   中英

如何在Java 1.4中播放WAV文件

[英]how to play wav file in java 1.4

作為標題如何在Java v1.4中反復播放聲音文件?

如果您只想播放wav文件,那么'org.life.java'的答案是正確的。 對於其他格式類型,可以使用JMF( http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140239.html )。

注意: JMF現在已經過時了...但是它將與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!");
  }
} 

這將在JDK 1.4(在Windows XP和JDK 1.4.2_06中測試)中起作用。 另一個答案失敗,因為正如注釋中正確指出的那樣,JDK 1.4上不存在AudioSystem.getClip() 以下是使用DataLine並在單獨的Thread中播放以提高整體性能的完整資源(以main函數的形式,但可以適用於其他任何形式):

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

  }
}

問題和答案都非常老舊,但是我只需要在一台只能運行Windows XP的無風扇微型PC上進行這項工作,... \\ _(ツ)_ /¯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM