1

as title 如何在 java v1.4 中重复播放声音文件?

4

3 回答 3

0

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

注意: JMF 现在已经过时了......但它可以与 jdk 1.4 一起使用

于 2010-09-29T10:59:39.120 回答
0
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!");
  }
} 
于 2010-09-29T12:47:07.207 回答
0

这将在 JDK 1.4 中工作(在 Windows XP 和 JDK 1.4.2_06 中测试)。另一个答案失败了,因为正如评论中正确指出的那样,AudioSystem.getClip()JDK 1.4 上不存在。下面是一个完整的源代码(以 main 函数的形式,但它适用于其他任何东西),它DataLine在单独的线程中使用和播放以获得更好的整体性能:

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 上完成这项工作,所以...¯\_(ツ)_/¯

于 2019-05-02T01:08:30.743 回答