【问题标题】:Java - Multi threading sound clips to play at same timeJava - 多线程声音剪辑同时播放
【发布时间】:2017-03-15 09:20:45
【问题描述】:

问题;执行时只听到一个声音片段。一种声音播放后,另一种声音不播放,也不能同时播放。

结果;能够同时播放 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

【问题讨论】:

  • 您的描述有点混乱。您是否同时听到它们?你要哪个?
  • 我以为 Java Sound 已经是多线程的了
  • 嗨!我刚刚更新了描述,使其更加清晰。我不确定是不是这样,所以我只是创建了新线程。我一次只听一个,我想同时听两个。
  • 根据我有限的测试,finish 应该声明为volatile,但是,CountDownLatch 实际上是一个更好的机制来监控两个线程何时完成
  • 声明完成为 volatile 但仍然只运行一个。我相信这也可能是while( !s1.finished || !s2.finished) 的问题

标签: java multithreading audio


【解决方案1】:

进口:

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

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

【讨论】:

    【解决方案2】:

    固定:

      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.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多