2010-09-23 54 views
14

Tôi đang làm việc với xử lý SMS, phần mềm dựa trên java và muốn phát âm thanh tiếng bíp/cảnh báo bất cứ khi nào chúng tôi nhận được tin nhắn. Tôi đã thử nhìn vào các thư viện java.sound và không thể tìm thấy bất cứ điều gì. Tôi không biết nếu đi các cách applet chơi một âm thanh sẽ không sao trong một ứng dụng java! Có bất kỳ âm thanh được xác định trước nào trong bất kỳ thư viện java nào mà chúng tôi có thể gọi trong một ứng dụng không? Mọi con trỏ sẽ được đánh giá cao!Làm cách nào để phát âm thanh (cảnh báo) trong ứng dụng java?

Trả lời

6

Bạn có thể có một cái nhìn tại các phương pháp bíp trong lớp Toolkit, như here

2

Tuyến Applet nên được tốt (và rất đơn giản). Để tránh tạo một cá thể Applet, bạn có thể sử dụng phương thức tĩnh newAudioClip và sau đó gọi play() trên số AudioClip được tạo.

URL url = getClass().getResource("/foo/bar/sound.wav"); 
AudioClip clip = Applet.newAudioClip(url); 
clip.play(); 
+0

bất kỳ ý tưởng tại sao câu trả lời này không được sử dụng rộng rãi? Có vẻ như rất đơn giản và hữu ích ... – RaKXeR

37

Nếu bạn chỉ muốn có một tiếng bíp hoặc cảnh báo nhanh chóng thử

Toolkit.getDefaultToolkit().beep(); 
+1

Điều này có thể không hoạt động trong Linux. – Augustin

+0

FYI, hoạt động tốt trên Windows 10. Cảm ơn bạn – Nabin

+1

nhập java.awt.Toolkit; –

1

Nếu bạn muốn sử dụng gói âm thanh để đóng một tập tin âm thanh tùy ý, bạn có thể sử dụng gói javax.sound.sampled. Đây là mã sẽ phát một tệp âm thanh:

 
private void playSound(File f) { 
    Runnable r = new Runnable() { 
     private File f; 

     public void run() { 
      playSoundInternal(this.f); 
     } 

     public Runnable setFile(File f) { 
      this.f = f; 
      return this; 
     } 
    }.setFile(f); 

    new Thread(r).start(); 
} 

private void playSoundInternal(File f) { 
    try { 
     AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(f); 
     try { 
      Clip clip = AudioSystem.getClip(); 
      clip.open(audioInputStream); 
      try { 
       clip.start(); 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       clip.drain(); 
      } finally { 
       clip.close(); 
      } 
     } catch (LineUnavailableException e) { 
      e.printStackTrace(); 
     } finally { 
      audioInputStream.close(); 
     } 
    } catch (UnsupportedAudioFileException e) { 
     e.printStackTrace(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Bạn có thể giải thích lý do tại sao chúng ta cần chuỗi ngủ sau khi gọi clip.start()? – lucks

+0

Đã một thời gian kể từ khi tôi viết mã này, nhưng tôi đoán là nó có thể hoạt động tốt với 'Thread.yield()'. –

+0

Tôi đã đề cập đến lý do tại sao chúng tôi cần chặn ở vị trí đầu tiên, nhưng tôi nhận ra rằng có lẽ vì chúng tôi muốn đóng dòng trước khi kết thúc chơi – lucks

23

Bạn có thể tạo âm thanh của riêng mình nếu bạn tìm kiếm thứ gì đó ít nhàm chán hơn âm thanh bên ngoài.

import javax.sound.sampled.*; 

public class SoundUtils { 

    public static float SAMPLE_RATE = 8000f; 

    public static void tone(int hz, int msecs) 
    throws LineUnavailableException 
    { 
    tone(hz, msecs, 1.0); 
    } 

    public static void tone(int hz, int msecs, double vol) 
     throws LineUnavailableException 
    { 
    byte[] buf = new byte[1]; 
    AudioFormat af = 
     new AudioFormat(
      SAMPLE_RATE, // sampleRate 
      8,   // sampleSizeInBits 
      1,   // channels 
      true,  // signed 
      false);  // bigEndian 
    SourceDataLine sdl = AudioSystem.getSourceDataLine(af); 
    sdl.open(af); 
    sdl.start(); 
    for (int i=0; i < msecs*8; i++) { 
     double angle = i/(SAMPLE_RATE/hz) * 2.0 * Math.PI; 
     buf[0] = (byte)(Math.sin(angle) * 127.0 * vol); 
     sdl.write(buf,0,1); 
    } 
    sdl.drain(); 
    sdl.stop(); 
    sdl.close(); 
    } 

    public static void main(String[] args) throws Exception { 
    SoundUtils.tone(1000,100); 
    Thread.sleep(1000); 
    SoundUtils.tone(100,1000); 
    Thread.sleep(1000); 
    SoundUtils.tone(5000,100); 
    Thread.sleep(1000); 
    SoundUtils.tone(400,500); 
    Thread.sleep(1000); 
    SoundUtils.tone(400,500, 0.2); 

    } 
} 

thí nghiệm âm thanh hơn ở đây: Produce special sound effect

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