# java: einen sound abspielen



## fishguts (8. Mai 2002)

ich hab ein kleines program geschrieben, dass ein fenster öffnet, in dem sich eine kugel frei bewegt
sobald die kugel den rand des fensters berührt, prallt sie, natürlich physikalisch richtig, ab 
nun soll aber jedes mal ein kurzer sound abgespielt werden, wenn die kugel den rand berührt
wie kann ich also in java *möglichst einfach* einen sound abspielen?
danke, für eure hilfe


----------



## laZ (4. Juni 2002)

huuu... muss ausm geschäft, deshalb nur links:
http://java.sun.com/docs/books/tutorial/sound/playing.html 
englisches tutorial von sun

http://java-tutor.com/javabuch/
klasse onlineversion von nem geilen buch


----------



## Carndret (6. Juni 2002)

Hier ist noch ein etwas einfacheres Beispiel. Reicht vielleicht aus.
http://javaboutique.internet.com/tutorials/Step/Chapter3/SoundExample.html
Bin gerade selbst dabei gewesen etwas zu suchen und bin darüber gestolpert.


----------



## Thomas Darimont (15. August 2003)

Servus!


```
import javax.sound.sampled.*;
import java.io.*;

/*
 * SoundTest.java
 *
 * Created on 1. August 2003, 21:06
 */

/**
 *
 * @author  Administrator
 */
public class SoundTest {
    
    /** Creates a new instance of SoundTest */
    public SoundTest() {
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        
        try{
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("C:/WINNT/Media/Windows-Anmeldeklang.wav"));
            AudioFormat af     = audioInputStream.getFormat();
            int size      = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
            byte[] audio       = new byte[size];
            DataLine.Info info      = new DataLine.Info(Clip.class, af, size);
            audioInputStream.read(audio, 0, size);
            
           // for(int i=0; i < 32; i++) {
                Clip clip = (Clip) AudioSystem.getLine(info);
                clip.open(af, audio, 0, size);
                clip.start();
           // }
        }catch(Exception e){ e.printStackTrace(); }
        
    }
    
}
```

Gruß Tom


----------



## BMo (8. Februar 2004)

*Hey Ho*

Hi! 
Ich hab das Programm etwas ausgebaut! In einen Wecker mit Musik.  
>>>>>>

```
import javax.sound.sampled.*;
import java.io.*;               //Zum einlesen der Tastatur über BufferedReader und InputStreamReader

class Eieruhr{

      int sekunden,minuten;
      public static int beenden;
      Thread zählerThread; 

      void eingabe() {

           System.out.println( );
           System.out.println("Die akustische  Eieruhr                                   [made by BMo]" );
           System.out.println( );
           System.out.println( );
           System.out.println("Geben Sie die gewuenschte Zeitdauer ein " );
           System.out.println( );
           System.out.print("[Minuten]  "  );
           minuten=readint();
           System.out.print("[Sekunden] " );
           sekunden=readint();
           System.out.println( );

           if (minuten==0&&sekunden==0) {
              System.out.println("Error --- Programm beendet" );
              System.exit(0);
           }

      }

      void zeit() {

           zählerThread = new Thread();

           try {
               zählerThread.sleep(1000);//Pause für 1Sekunde aus anderen Programmen von mir erdacht
               } catch (InterruptedException e){}


      }

      void ablauf() {

           eingabe();

           do { 
             
           zeit();
           sekunden-=1;

           if (sekunden==-1  ) {
               minuten-=1;
               sekunden=59;
           }
           
           anzeige();

           } while (minuten!=00||sekunden!=00);

           ende();
      }

      void anzeige() {

           if ( sekunden<=9&&minuten<=9 ) {

              System.out.print("\rNoch 0"+minuten+" Minuten und 0"+sekunden+" Sekunden"  );
             
           }
           if ( sekunden>=10&&minuten<=9 ) {

              System.out.print("\rNoch 0"+minuten+" Minuten und "+sekunden+" Sekunden");

           }
           if ( sekunden<=9&&minuten>=10 ) {

              System.out.print("\rNoch "+minuten+" Minuten und 0"+sekunden+" Sekunden"   );

           }
           if ( sekunden>=10&&minuten>=10 ) {

              System.out.print("\rNoch "+minuten+" Minuten und "+sekunden+" Sekunden" );

           }
      }

      void ende() {

           System.out.println( );
           System.out.println("Fertig ");
           System.out.println("                                   [zum Beenden Enter druecken]" );

      }

         /** Creates a new instance of Eieruhr */
      public Eieruhr() {
      }


      public static void main ( String[]args ) {

             Eieruhr zeitablauf=new Eieruhr();

             zeitablauf.ablauf();
             zeitablauf.beenden=1;
//______________________________________________________________________________
//Sound
            try{

                AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("C:/WINDOWS/Media/EE_REV.wav"));

                AudioFormat af     = audioInputStream.getFormat();
                int size      = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
                byte[] audio       = new byte[size];
                DataLine.Info info      = new DataLine.Info(Clip.class, af, size);
                audioInputStream.read(audio, 0, size);
            

                Clip clip = (Clip) AudioSystem.getLine(info);
                clip.open(af, audio, 0, size);

                Beender ende = new Beender();
                ende.start();

                do {
                   clip.start();
                   while (clip.isActive()){}
                   clip.stop();
                   } while (zeitablauf.beenden==1);

                clip.close();
                System.exit(0);

            }
            //-----------------------------------------------------------------------------
            //Wenn Sound nicht vorhanden ist (Windows NT)
            catch(Exception e){
                try {
                     AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("C:/WINNT/Media/Der Microsoft-Sound.wav"));

                     AudioFormat af     = audioInputStream.getFormat();
                     int size      = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
                     byte[] audio       = new byte[size];
                     DataLine.Info info      = new DataLine.Info(Clip.class, af, size);
                     audioInputStream.read(audio, 0, size);


                     Clip clip = (Clip) AudioSystem.getLine(info);
                     clip.open(af, audio, 0, size);

                     Beender ende = new Beender();
                     ende.start();

                     do {
                        clip.start();
                        while (clip.isActive()){}
                        clip.stop();
                        } while (zeitablauf.beenden==1);

                      clip.close();
                      System.exit(0);

                }
                //-----------------------------------------------------------------------------
                //Wenn Sound nicht vorhanden ist
                catch(Exception x){
                     try {
                         AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("C:/Windows/Media/Der Microsoft-Sound.wav"));

                         AudioFormat af     = audioInputStream.getFormat();
                         int size      = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
                         byte[] audio       = new byte[size];
                         DataLine.Info info      = new DataLine.Info(Clip.class, af, size);
                         audioInputStream.read(audio, 0, size);


                         Clip clip = (Clip) AudioSystem.getLine(info);
                         clip.open(af, audio, 0, size);

                         Beender ende = new Beender();
                         ende.start();

                         do {
                            clip.start();
                            while (clip.isActive()){}
                            clip.stop();
                            } while (zeitablauf.beenden==1);

                         clip.close();
                         System.exit(0);

                     }
                     //-----------------------------------------------------------------------------
                     //Falls keiner der Sounds vorhanden ist
                     catch(Exception y){
                                 y.printStackTrace();
                                 System.out.println("[Soundfile nicht vorhanden]" );
                                 System.exit(0);
                     }
                }
            }


//______________________________________________________________________________

      }



  /**
     * Wartet auf Eingabe von der Komandozeile,
     * liefert ein Wert vom Grundtyp int
     */
  public static int readint() {
    BufferedReader reader = new
      BufferedReader(new InputStreamReader(System.in));
    String line="";
    System.out.flush();
    try {
      line=reader.readLine();
    }
    catch (Exception e) { System.out.println(e); }
    try {
      return (new Integer(line)).intValue();
    }
    catch (Exception e) { return 0; }
  }


}
//-----------------------------------------------------------------------------
//Thread zum beenden der Soundschleife
class Beender extends Thread {

      public void run() {
             Eieruhr bEnde = new Eieruhr();
             bEnde.beenden=bEnde.readint();
      }


}
```
>>>>>>

Jetzt mal ne Frage, kann ich daraus irgendwie kostenlos ne .exe oder .bat oder so machen?


----------



## MiRaMC (15. Februar 2004)

Hier ein paar Links:

http://www.faqs.org/faqs/de/comp-lang-java/faq/
http://www.excelsior-usa.com/jetse.html 
http://www.duckware.com/java2exe.html

Man kann auch das Programm in ein Jar - Archiv konvertieren, das dann selbstänig ausführbar ist


----------



## frontier (9. Juli 2007)

Hi,

habe den Code mal soweit ausprobiert, klappt auch alles hervorragend, nur gibt es leider ein kleines Problem.

Damit die audio Datei auch in einer JAR-Datei gefunden wird habe ich folgende Zeilen benutzt:


```
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("sound/lastofthejedi.wav"));
	    AudioFormat af = audioInputStream.getFormat();
	    int size = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
	    byte[] audio = new byte[size];
	    DataLine.Info info = new DataLine.Info(Clip.class, af, size);
            audioInputStream.read(audio, 0, size);
            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(af, audio, 0, size);
            clip.start();
```

Wenn ich das JavaProgramm so starte gibt es keine Probleme. Nur sobald ich die als JAR Datei packe, spielt er die wav. Datei nur ganz kurz an (man hört die ersten milisekunden) und ist dann auf einmal stumm.

Hat jemand ne Ahnung woran das liegen könnte?

mfg


----------



## frontier (10. Juli 2007)

Hat sich erledigt, einfach nen BufferedInputStream dazwischen schalten schon gehts.

mfg


----------



## Adler86 (16. Juli 2007)

Hallo

Ich habe es inzwischen auch geschafft Sound in Java abzuspielen. Aber leider nie über 30sec... wie kann man längere Dateien abspielen?

Falls dazu jemand etwas weis, danke für euere Tipps


----------



## Nao (5. September 2009)

Wenn ich das JavaProgramm so starte gibt es keine Probleme. Nur sobald ich die als JAR Datei packe, spielt er die wav. Datei nur ganz kurz an (man hört die ersten milisekunden) und ist dann auf einmal stumm.

Hat jemand ne Ahnung woran das liegen könnte?

mfg


----------



## darkmagic2002 (6. September 2009)

Hey,
wie oben schon erwähnt, musst du den _AudioInputStream_ buffern:


```
URL soundURL; //ist zu initialisieren

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(soundURL);
BufferedInputStream bufferedInputStream = new BufferedInputStream(audioInputStream);
	    AudioFormat af = audioInputStream.getFormat();
	    int size = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
	    byte[] audio = new byte[size];
	    DataLine.Info info = new DataLine.Info(Clip.class, af, size);
            bufferedInputStream.read(audio, 0, size);
            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(af, audio, 0, size);
            clip.start();
```

greets,
kevin


----------



## jmgni (14. Juli 2014)

Bei mir funktioniert der Testcode nur unter OSX nicht unter Windows 7. Woran kann das liegen? 

LG

J


----------



## vfl_freak (14. Juli 2014)

Moin,



jmgni hat gesagt.:


> Bei mir funktioniert der Testcode nur unter OSX nicht unter Windows 7. Woran kann das liegen?


Möglicherweise am Alter des Threads  ??

Was genau mag wohl "funktioniert nicht" bedeuten ?? *grübel*

Gruß
Klaus


----------



## Thomas Darimont (14. Juli 2014)

Hallo,

das Codebeispiel ist schon ziemlich alt (11 Jahre  und seitdem hat sich einiges getan...
Da das Abspielen des Sounds asynchron ausgeführt wird, muss man (in dem Beispiel) in dem aufrufenden Thread entsprechend warten bis der Sound fertig abgespielt wurde.

```
package de.tutorials.training;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineEvent;
import java.io.File;
import java.io.FileInputStream;

public class SoundTest {

    public static void main(String[] args) throws Exception {

        Object lock = new Object();

        String soundFile = "C:/Windows/Media/tada.wav";

        try (AudioInputStream ais = AudioSystem.getAudioInputStream(new File(soundFile))) {

            Clip clip = AudioSystem.getClip();
            clip.open(ais);
            clip.addLineListener((e) -> {
                if (e.getType() == LineEvent.Type.STOP) {
                    synchronized (lock) {
                        lock.notify();
                    }
                }
            });

            clip.start();
        }

        synchronized (lock) {
            lock.wait();
        }
    }
}
```

Mit Java FX geht das (mit dem entsprechenden Rahmen) noch etwas einfacher:

```
package de.tutorials.training;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;

import java.io.File;

public class SoundTest extends Application {

    public static void main(String[] args) throws Exception {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        Media media = new Media(new File("c:/Windows/Media/tada.wav").toURI().toURL().toString());

        MediaPlayer player = new MediaPlayer(media);
        player.setOnEndOfMedia(Platform::exit);

        player.play();
    }
}
```


Viele Grüße,
Tom


----------



## Der Heilige (27. Januar 2017)

Moin.
Wie kann ich kann ich andere Audio Formate wie mp3 oder ogg wiedergeben.
Kann mir da jemand helfen ?
Gruß Der Heilige


----------



## vfl_freak (27. Januar 2017)

Moin,

zuminsdest mp3 sollte gehen !
http://stackoverflow.com/questions/6045384/playing-mp3-and-wav-in-java

Gruß Klaus


----------



## Der Heilige (27. Januar 2017)

Danke Klaus,
das Hilft mir schon mal erheblich weiter sollte jemand noch eine Idee für ogg haben, würde mich das sehr freuen. Da ich ogg gerade nur über vlcj wieder geben kann und mir das zu CPU listig ist bis 65 % .
Gruß Der Heilige


----------

