2010-09-23 16 views
14

Pracuję z obsługą wiadomości SMS, oprogramowaniem opartym na języku Java i chcę odtwarzać dźwięk i dźwięk alertu za każdym razem, gdy otrzymamy wiadomość. Próbowałem przeglądać biblioteki java.sound i nie mogłem nic znaleźć. Nie wiem, czy użycie apletu do odtwarzania dźwięku będzie w porządku w aplikacji java! Czy są jakieś predefiniowane dźwięki w dowolnych bibliotekach Java, które możemy wywołać w aplikacji? Wszelkie wskazówki zostaną docenione!Jak odtwarzać dźwięk (alert) w aplikacji java?

Odpowiedz

6

można przyjrzeć się metodzie beep w klasie Toolkit, jak pokazano here

2

Trasa aplet powinny być dobre (i jest bardzo proste). Aby uniknąć tworzenia instancji apletu, można użyć metody statycznej: newAudioClip, a następnie wywołać play() w utworzonym AudioClip.

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

jakiś pomysł, dlaczego ta odpowiedź nie jest powszechnie stosowane? Wydaje się niezwykle prosty i użyteczny ... – RaKXeR

37

Jeśli chcesz tylko sygnał dźwiękowy lub szybkie powiadomienie spróbować

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

To może nie działać pod Linuksem. – Augustin

+0

FYI, działa poprawnie na Windows 10. Dziękuję – Nabin

+1

import java.awt.Toolkit; –

1

Jeśli chcesz użyć pakietu dźwiękową do gry dowolny plik dźwiękowy, można użyć pakietu javax.sound.sampled. Oto kod, który odegra plik dźwiękowy:

 
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

Czy możesz wyjaśnić, dlaczego potrzebujemy wątku do snu po wywołaniu clip.start()? – lucks

+0

Minęło trochę czasu odkąd napisałem ten kod, ale domyślam się, że prawdopodobnie działałoby równie dobrze z 'Thread.yield()'. –

+0

Chodzi mi o to, dlaczego musimy blokować, ale zdałem sobie sprawę, że to prawdopodobnie dlatego, że zamknęliśmy linię, zanim zakończy się gra – lucks

23

Można wygenerować swój własny dźwięk, jeśli szukasz czegoś mniej nudny niż sygnałem dźwiękowym() bez zewnętrznego pliku dźwiękowego.

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

    } 
} 

dźwiękowe eksperymenty Więcej tutaj: Produce special sound effect

Powiązane problemy