Java - 同时播放多线程声音片段

时间:2017-03-14 23:14:43

标签: java multithreading audio

问题;执行时只听到一个声音片段。播放一个声音后,另一个声音播放&两者都不能同时玩。

结果;能够同时播放2个声音。

代码:

 import java.io.*;
 import javax.sound.sampled.*;
 public class ThreadPlay extends Thread {
 private String filename; // The name of the file to play
 private boolean finished; // A flag showing that the thread has finished

private ThreadPlay(String fname) {
    filename = fname;
    finished = false;
}

public static void main(String[] args) {
    ThreadPlay s1 = new ThreadPlay("soundClip1.wav");
    ThreadPlay s2 = new ThreadPlay("soundClip2.wav");
    s1.start();
    s2.start();

    while (!s1.finished || !s2.finished);


    System.exit(0); // Java Sound bug fix...
}

public void run() {

    try {
        File file = new File(filename);
        AudioInputStream stream = AudioSystem.getAudioInputStream(file);
        AudioFormat format = stream.getFormat();
        DataLine.Info info = new DataLine.Info(Clip.class, format);
        Clip clip = (Clip)AudioSystem.getLine(info);
        clip.open(stream);
        clip.start();
        Thread.sleep(100);
        while (clip.isRunning()) { Thread.sleep(100); }
        clip.close();
    }

    catch (Exception e) { }
    finished = true;
}
  }

音频线:

 AudioSystem.getMixerInfo() results in:
                  [Ljavax.sound.sampled.Mixer$Info;@52cc8049

 Array length: 7 
 Contents:
     PulseAudio Mixer, version 0.02
     default [default], version 4.4.0-66-generic
     PCH [plughw:0,0], version 4.4.0-66-generic
     PCH [plughw:0,1], version 4.4.0-66-generic
     PCH [plughw:0,3], version 4.4.0-66-generic
     PCH [plughw:0,7], version 4.4.0-66-generic
     Port PCH [hw:0], version 4.4.0-66-generic

  For each mixer, AudioSystem.getMixer(AudioSystem.getMixerInfo()[x])
   Results:
      org.classpath.icedtea.pulseaudio.PulseAudioMixer@685f4c2e
      com.sun.media.sound.DirectAudioDevice@7a07c5b4
      com.sun.media.sound.DirectAudioDevice@5ce65a89
      com.sun.media.sound.DirectAudioDevice@1de0aca6
      com.sun.media.sound.DirectAudioDevice@443b7951
      com.sun.media.sound.DirectAudioDevice@45283ce2
      com.sun.media.sound.PortMixer@4d76f3f8

2 个答案:

答案 0 :(得分:3)

进口:

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

运行方法:

public void run() {
    try {
        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(this.getClass().getResource("NameOfFile.wav"));
        Clip clip = AudioSystem.getClip();
        clip.open(audioInputStream);
        clip.start();
        clip.loop(Clip.LOOP_CONTINUOUSLY); // There are several different amounts of time you can loop it, so you can change this if you want, or you can just use clip.stop() whenever you want.
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

如果你在多个线程上使用这个和一段代码,它应该工作。如果我认为你正在启动这段代码两次,每个线程一次,那么这应该是正确的。我希望这会有所帮助。

答案 1 :(得分:0)

修正:

  public void run() {
    try {
        File file = new File(filename);
        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
        DataLine.Info info = new DataLine.Info(Clip.class, audioInputStream.getFormat());
        Clip clip = (Clip)AudioSystem.getLine(info);
        clip.open(audioInputStream);
        clip.start();
        clip.loop(Clip.LOOP_CONTINUOUSLY); // There are several different amounts of time you can loop it, so you can change this if you want, or you can just use clip.stop() whenever you want.
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    finished = true;
}

另外,如果您像我一样运行Ubuntu,则需要remove OpenJDK/OpenJRE and set SunJDK/SunJRE as Default.