Anzeige

java: einen sound abspielen


fishguts

Erfahrenes Mitglied
#1
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
 
#4
Servus!

Code:
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
 
#5
Hey Ho

Hi!
Ich hab das Programm etwas ausgebaut! In einen Wecker mit Musik. :rolleyes:
>>>>>>
Code:
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?
 
Zuletzt bearbeitet:

frontier

Grünschnabel
#7
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:

Code:
	    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
 

Adler86

Grünschnabel
#9
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
 
#10
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
 
#11
Hey,
wie oben schon erwähnt, musst du den AudioInputStream buffern:

Java:
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
 
#14
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.
Java:
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:
Java:
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
 
#17
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
 
Anzeige
Anzeige