2009-02-23 11 views
6

Ich versuche, eineProbleme beim Abspielen wav in Java

PCM_UNSIGNED 11025.0 Hz, 8 bit, mono, 1 bytes/frame 

Datei wie beschrieben here (1) und here(2) zu spielen.

Der erste Ansatz funktioniert, aber ich möchte nicht auf sun.* Sachen abhängen. Die zweite führt dazu, dass nur einige der Hauptrahmen gespielt werden, was eher wie ein Klick klingt. Kann nicht ein IO-Problem sein, da ich von einem ByteArrayInputStream spiele.

PLZ teilen Sie Ihre Ideen, warum dies passieren könnte. TIA.

Antwort

23

Ich bin nicht sicher, warum der zweite Ansatz, den Sie verknüpften, einen anderen Thread startet; Ich glaube, der Ton wird sowieso in einem eigenen Thread abgespielt. Ist das Problem, dass Ihre Anwendung beendet wird, bevor der Clip wiedergegeben wurde?

import javax.sound.sampled.*; 
import java.io.File; 
import java.io.IOException; 
import javax.sound.sampled.LineEvent.Type; 

private static void playClip(File clipFile) throws IOException, 
    UnsupportedAudioFileException, LineUnavailableException, InterruptedException { 
    class AudioListener implements LineListener { 
    private boolean done = false; 
    @Override public synchronized void update(LineEvent event) { 
     Type eventType = event.getType(); 
     if (eventType == Type.STOP || eventType == Type.CLOSE) { 
     done = true; 
     notifyAll(); 
     } 
    } 
    public synchronized void waitUntilDone() throws InterruptedException { 
     while (!done) { wait(); } 
    } 
    } 
    AudioListener listener = new AudioListener(); 
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(clipFile); 
    try { 
    Clip clip = AudioSystem.getClip(); 
    clip.addLineListener(listener); 
    clip.open(audioInputStream); 
    try { 
     clip.start(); 
     listener.waitUntilDone(); 
    } finally { 
     clip.close(); 
    } 
    } finally { 
    audioInputStream.close(); 
    } 
} 
+0

Tatsächlich führe ich es nicht in einem separaten Thread, nur aus Gründen der Kürze verbunden. DANKE !!! – yanchenko

+0

@Jataro - Sie sind richtig; Ich hatte diesen Aufruf in der API verpasst; Ich werde den Code aktualisieren. – McDowell

+0

drain() scheint nicht anwendbar auf Clips nach http://download.oracle.com/javase/tutorial/sound/playing.html – lucks