2010-09-23 116 views
14

我正在使用基於Java的軟件進行短信處理,並希望在收到消息時發出嗶聲/警報聲。我試着看着java.sound庫並找不到任何東西。我不知道在Java應用程序中播放聲音的applet方式是否可行!是否有任何預定義的聲音在我們可以在應用程序中調用的任何Java庫中?任何指針將不勝感激!如何在Java應用程序中播放聲音(提醒)?

回答

6

你可以看看Toolkit類中的蜂鳴方法,如圖here

2

applet的路徑應該是罰款(和非常簡單)。爲避免創建Applet實例,您可以使用靜態newAudioClip方法,然後在創建的AudioClip上調用play()

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

任何想法,爲什麼這個答案沒有被廣泛使用?它看起來非常簡單和有用... – RaKXeR 2017-09-20 16:09:22

37

如果你只是想蜂鳴聲或快速警報嘗試

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

這可能無法在Linux下工作。 – Augustin 2016-05-16 18:35:32

+0

FYI,在Windows 10上正常工作。謝謝 – Nabin 2016-08-25 06:53:00

+1

import java.awt.Toolkit; – 2017-05-19 03:09:27

1

如果你想使用的聲音包打一個任意聲音文件,你可以使用javax.sound.sampled包。下面是代碼,將播放聲音文件:

 
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

你能否解釋爲什麼我們需要線程在調用clip.start()後進入睡眠狀態? – lucks 2011-05-11 01:19:42

+0

自從我編寫這段代碼以來已經有一段時間了,但我的猜測是,它可能與'Thread.yield()'一樣好。 – 2011-05-11 17:05:46

+0

我指的是爲什麼我們需要首先阻止,但我意識到這可能是因爲我們會在完成播放之前關閉線路 – lucks 2011-05-11 19:42:08

23

您可以生成自己的聲音,如果你在尋找比嘟不那麼無聊的東西()無需外部聲音文件。

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); 

    } 
} 

更完善的實驗在這裏:Produce special sound effect

相關問題