Audio file plays in Eclipse IDE; but NOT as JAR file

后端 未结 1 1577
太阳男子
太阳男子 2020-12-21 12:30

The audio file that I am using is found here: http://www.orangefreesounds.com/loud-alarm-clock-sound/

This is what my file structure looks like in my Eclipse IDE: <

相关标签:
1条回答
  • 2020-12-21 13:02

    Adding clip.drain() after clip.start() seems to have worked okay for me (IDE and command line both with and without &)

    import java.io.IOException;
    import java.net.URL;
    import javax.sound.sampled.AudioFormat;
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.Clip;
    import javax.sound.sampled.DataLine;
    import javax.sound.sampled.LineUnavailableException;
    import javax.sound.sampled.UnsupportedAudioFileException;
    
    public class Sandbox {
    
        public static void main(String[] args)  {
            try {
                URL url = Sandbox.class.getResource("/sound-effects/Loud-alarm-clock-sound.wav");
                AudioInputStream ais = AudioSystem.getAudioInputStream(url);
                AudioFormat af = ais.getFormat();
                DataLine.Info info = new DataLine.Info(Clip.class, af);
    
                Clip clip = (Clip) AudioSystem.getLine(info);
                clip.open(ais);
                clip.start();
                System.out.println("Drain...");
                clip.drain();
                System.out.println("...Drained");
            } catch (UnsupportedAudioFileException | IOException | LineUnavailableException exp) {
                exp.printStackTrace();
            }
        }
    
    }
    

    Now, having said that, I have found drain a little unreliable in the past, especially when there are multiple sounds playing in which case I tend to use a LineListener

    For example...

    import java.io.IOException;
    import java.net.URL;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.sound.sampled.AudioFormat;
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.Clip;
    import javax.sound.sampled.DataLine;
    import javax.sound.sampled.LineEvent;
    import javax.sound.sampled.LineListener;
    import javax.sound.sampled.LineUnavailableException;
    import javax.sound.sampled.UnsupportedAudioFileException;
    
    public class Sandbox {
    
        protected static final Object LOCK = new Object();
    
        public static void main(String[] args) {
            try {
                URL url = Sandbox.class.getResource("/sound-effects/Loud-alarm-clock-sound.wav");
                AudioInputStream ais = AudioSystem.getAudioInputStream(url);
                AudioFormat af = ais.getFormat();
                DataLine.Info info = new DataLine.Info(Clip.class, af);
    
                Clip clip = (Clip) AudioSystem.getLine(info);
                clip.open(ais);
    
                clip.addLineListener(new LineListener() {
                    @Override
                    public void update(LineEvent event) {
                        System.out.println(event.getType());
                        if (event.getType() == LineEvent.Type.STOP) {
                            synchronized (LOCK) {
                                LOCK.notify();
                            }
                        }
                    }
                });
                clip.start();
    
                synchronized (LOCK) {
                    LOCK.wait();
                }
            } catch (UnsupportedAudioFileException | IOException | LineUnavailableException | InterruptedException exp) {
                exp.printStackTrace();
            }
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题