2009-02-23 12 views
6

Sto cercando di riprodurre un fileproblemi a giocare wav in Java

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

come descritto here (1) e here(2).

Il primo approccio funziona, ma non voglio dipendere da roba sun.*. Il secondo si traduce in alcuni dei fotogrammi principali in riproduzione, che suona più come un clic. Non può essere un problema di I/O poiché sto giocando da un ByteArrayInputStream.

Plz condividi le tue idee sul perché questo potrebbe accadere. TIA.

risposta

23

Non sono sicuro del motivo per cui il secondo approccio a cui si è collegati inizia un altro thread; Credo che l'audio verrà riprodotto nella sua stessa discussione comunque. Il problema è che l'applicazione finisce prima che la clip abbia finito di suonare?

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

Infatti non lo eseguo in un thread separato, solo collegato per brevità. GRAZIE MOLTO !!! – yanchenko

+0

@Jataro - sei corretto; Mi ero perso quella chiamata nell'API; Aggiornerò il codice – McDowell

+0

drain() non sembra essere applicabile alle clip in base a http://download.oracle.com/javase/tutorial/sound/playing.html – lucks