2009-02-23 19 views
6

estoy tratando de reproducir un archivoproblemas para reproducir wav en Java

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

como se describe here (1) y here(2).

El primer enfoque funciona, pero no quiero depender de sun.* cosas. El segundo da como resultado solo algunos de los principales cuadros que se están reproduciendo, que suena más como un clic. No puede ser un problema de IO porque estoy jugando desde un ByteArrayInputStream.

Comparta sus ideas sobre por qué podría suceder esto. TIA.

Respuesta

23

No estoy seguro de por qué el segundo enfoque al que está vinculado inicia otro hilo; Creo que el audio se reproducirá en su propio hilo de todos modos. ¿El problema que su aplicación termina antes de que el clip haya terminado de reproducirse?

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

De hecho, no lo ejecuto en un hilo separado, simplemente lo vinculé para abreviarlo. GRACIAS MUCHO !!! – yanchenko

+0

@Jataro - estás en lo cierto; Me perdí esa llamada en la API; Actualizaré el código. – McDowell

+0

drain() no parece ser aplicable a Clips de acuerdo con http://download.oracle.com/javase/tutorial/sound/playing.html – lucks

Cuestiones relacionadas