java: einen sound abspielen

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
 
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
 
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
 
Zurück