Sound wird nicht abgespielt

Dann07

Aktives Mitglied
Guten Tag/Abend!
Ich habe eine eigene kleine Library für mich geschrieben um das abspielen von Sounds leichter zu gestalten.
Nur habe ich ein Problem. Es wird alles ordnungsgerecht ausgegeben nur wird der Sound nicht abgespielt.

Code:

Java:
package *****.audio;

import java.io.*;

import javax.sound.sampled.*;

public class Audio {

    private Clip audioClip;
  
    public Audio(String audioFile) {
        try {
            File file = new File(audioFile);
            AudioInputStream ais = AudioSystem.getAudioInputStream(file);
            System.out.println("Create Clip...");
            audioClip = AudioSystem.getClip();
          
            System.out.println("Init...");
            init(ais);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  
    private void init(AudioInputStream ais) throws LineUnavailableException, IOException {
        audioClip.open(ais);
    }
  
    public void play() {
        audioClip.start();
        System.out.println("Started");
    }
  
    public void stop() {
        audioClip.stop();
        System.out.println("Stopped");
    }
}

EDIT:

Benutzung:

Java:
import *****.audio.Audio;

public class Main {

    public static void main(String[] args) {
        Audio audio = new Audio("wavFile.wav");
       
        audio.play();
    }

}

Einige vielleicht hilfreiche Informationen:
Java: JRE 1.8.0_201
JDK 1.8.0_211
Betriebssystem: Microsoft Windows 10
Editor/IDE: Eclipse
Grafikkarte, Prozessor usw. auf Abfrage
 
Zuletzt bearbeitet:
Java:
import *****.audio.Audio;

public class Main {

    public static void main(String[] args) {
        Audio audio = new Audio("wavFile.wav");
        
        audio.play();
    }

}
 
Ich denke das hast Du vergessen:
Java:
// open audioInputStream to the clip 
clip.open(audioInputStream);
 
Aha woher sollte ich das wissen?

Brauch getAudioInputStream() nicht absolute Pfade?

Ist das wav vielleicht klein/kurz? Hörst du was wenn du etwas anderes abspielst?
 
Nagut lade den Clip mal hoch

Bearbeitung:
Oder ne, versuche das mal
Java:
clip.start();
while (!clip.isRunning())
    Thread.sleep(10);
while (clip.isRunning())
    Thread.sleep(10);
clip.close();
 
Eigentlich nicht, mir brummt gerade die Rübe (Kopfschmerzen...)

Aber das Programm ist wohl schon zuende bevor der Clip startet. 🙁
Clip startet zwar einen Thread, aber das dauert ja auch etwas... Zudem ist er kein Daemon.
 
Der Clip startet einen eigenen (Daemon)-Thread, deine Main-Methode läuft nach play also weiter, während das Lied gespielt wird.
Wenn die Main-Methode durchgelaufen ist, gibt es deshalb nur noch den anderen Thread, da dieser aber ein Daemon ist, wird das Programm beendet.

Mit der Schleife wartest du jetzt so lange, wie der Clip läuft, du verhinderst also das Programmende 🙂
 
Qautsch, das Programm wäre schon fertig, bevor der (Daemon oder nicht) Thread startet. Das war das Problem.
 
Qautsch, das Programm wäre schon fertig, bevor der (Daemon oder nicht) Thread startet. Das war das Problem.
Nein, ist es nicht. Der Thread wird schon in open gestartet, er läuft also bereits, wenn man bei play ankommt.

Das Spielen der Musik geht aber erst mit play los - und direkt danach wird das Programm beenden (weil es eben ein Deamon-Thread ist), deshalb hört man nichts.
 
Wie würde das denn so etwa aussehen?
Zum Beispiel (Achtung: main inkl.)
Java:
import java.io.*;

import javax.sound.sampled.*;

public class Audio {

    private Clip audioClip;
  
    public Audio(String audioFile) {
        try {
            File file = new File(audioFile);
            AudioInputStream ais = AudioSystem.getAudioInputStream(file);
            System.out.println("Create Clip...");
            audioClip = AudioSystem.getClip();
          
            System.out.println("Init...");
            init(ais);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  
    private void init(AudioInputStream ais) throws LineUnavailableException, IOException {
        audioClip.open(ais);
    }

    public void addListener(LineListener listener) {
        audioClip.addLineListener(listener);
    }

    public void removeListener(LineListener listener) {
        audioClip.removeLineListener(listener);
    }
  
    public void play() {
        audioClip.start();
        System.out.println("Started");
    }

    public void stop() {
        audioClip.stop();
        System.out.println("Stopped");
    }

    public static void main(String[] args) {
        final Object lock = new Object();

        Audio audio = new Audio("wavFile.wav");
        audio.addListener(new LineListener() {
            @Override
            public void update(LineEvent e) {
                if (e.getType() == LineEvent.Type.STOP) {
                    synchronized(lock) {
                        lock.notify();
                    }
                }
            }
        });      

        synchronized(lock) {       
            audio.play();
            try {
                lock.wait();
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
    }
}
 
Wie auch immer: LineListener dazu, Thread warten lassen und im Listener am Ende des Clips aufwecken 🙂
Oder das Ganze in einen eigenen Thread packen, der nach dem Start des Sounds etwas wartet.
Java:
public class AudioPlayer extends Thread {
    private URL url;

    public AudioPlayer(String fileName) {
        try {
            File file = new File(fileName);
            if (file.canRead())
                url = file.toURI().toURL();
            else
                throw new IllegalArgumentException("can't read '" + fileName + "'");
        } catch (MalformedURLException e) {
            throw new IllegalArgumentException("can't convert '" + fileName + "' to URL", e);
        }
        if (url == null)
            throw new IllegalArgumentException("could not play '" + fileName + "'");
    }

    @Override
    public void run() {
        AudioClip clip = Applet.newAudioClip(url);
        clip.play();
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
Java:
..
new AudioPlayer(fileName).start();
..
 

Zurück
Oben