2009-02-23 40 views
6

Tôi đang cố gắng để chơi một fileSự cố khi phát wav trong Java

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

như mô tả here (1)here(2).

Cách tiếp cận đầu tiên hoạt động, nhưng tôi không muốn phụ thuộc vào công cụ sun.*. Kết quả thứ hai chỉ trong một số khung hình hàng đầu đang được phát, có vẻ giống như một cú nhấp chuột. Không thể là một vấn đề IO khi tôi đang chơi từ một ByteArrayInputStream.

Plz chia sẻ ý tưởng của bạn về lý do tại sao điều này có thể xảy ra. TIA.

Trả lời

23

Tôi không chắc chắn tại sao phương pháp tiếp cận thứ hai bạn liên kết để bắt đầu một chuỗi khác; Tôi tin rằng âm thanh sẽ được phát theo chủ đề riêng của nó. Vấn đề mà ứng dụng của bạn hoàn thành trước khi clip kết thúc phát chưa?

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

Trong thực tế, tôi không chạy nó trong một chủ đề riêng biệt, chỉ cần liên kết mà ngắn gọn. THANKS A LOT !!! – yanchenko

+0

@Jataro - bạn chính xác; Tôi đã bỏ lỡ cuộc gọi đó trong API; Tôi sẽ cập nhật mã. – McDowell

+0

drain() dường như không áp dụng cho các clip theo http://download.oracle.com/javase/tutorial/sound/playing.html – lucks

Các vấn đề liên quan