如何在java应用程序中播放声音(警报)?

如何在java应用程序中播放声音(警报)?,java,audio,Java,Audio,我正在使用基于java的SMS处理软件,希望在收到消息时播放蜂鸣音/警报音。我试图查看java.sound库,但什么也找不到。我不知道在java应用程序中使用applet方式播放声音是否合适!在任何java库中是否有我们可以在应用程序中调用的预定义声音?任何提示都将不胜感激 您可以查看Toolkit类中的beep方法,如图所示,applet路由应该很好(并且非常简单)。为了避免创建小程序实例,可以使用静态方法,然后在创建的AudioClip上调用play() URL url = getClass

我正在使用基于java的SMS处理软件,希望在收到消息时播放蜂鸣音/警报音。我试图查看java.sound库,但什么也找不到。我不知道在java应用程序中使用applet方式播放声音是否合适!在任何java库中是否有我们可以在应用程序中调用的预定义声音?任何提示都将不胜感激

您可以查看Toolkit类中的beep方法,如图所示,applet路由应该很好(并且非常简单)。为了避免创建小程序实例,可以使用静态方法,然后在创建的
AudioClip
上调用
play()

URL url = getClass().getResource("/foo/bar/sound.wav");
AudioClip clip = Applet.newAudioClip(url);
clip.play();
这里,
sound.wav
文件捆绑在您创建的
foo/bar
包中的
jar
文件中。全功能类(其中
wav
文件位于
sounds
包中)如下所示:

package sounds;

import java.applet.Applet;
import java.applet.AudioClip;

public class PlaySound {

    public void PlayBeep() {        
        AudioClip clip = Applet.newAudioClip(getClass().getResource("/sounds/beep3.wav"));
        clip.play();
    }
}

在这里,路径被指定为
/sounds/
,因为当您提取
jar
时,您会看到
wav
文件位于
jar
中的第一个文件夹中,如果您只想听到嘟嘟声或快速警报,那么它就是
sounds

Toolkit.getDefaultToolkit().beep();

如果要使用声音包播放任意声音文件,可以使用
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(); } } 专用void播放声音(文件f){ Runnable r=新的Runnable(){ 私有文件f; 公开募捐{ playSoundInternal(本文件f); } 公共可运行设置文件(文件f){ 这个。f=f; 归还这个; } }.setFile(f); 新线程(r.start(); } 私有void playSoundInternal(文件f){ 试一试{ AudioInputStream AudioInputStream=AudioSystem.getAudioInputStream(f); 试一试{ Clip Clip=AudioSystem.getClip(); clip.open(音频输入流); 试一试{ clip.start(); 试一试{ 睡眠(100); }捕捉(中断异常e){ e、 printStackTrace(); } 夹子。排水管(); }最后{ clip.close(); } }捕获(LineUnavailableException e){ e、 printStackTrace(); }最后{ audioInputStream.close(); } }捕获(不支持的数据文件异常e){ e、 printStackTrace(); }catch(filenotfounde异常){ e、 printStackTrace(); }捕获(IOE异常){ e、 printStackTrace(); } }
如果您正在寻找比没有外部声音文件的beep()更无趣的声音,则可以生成自己的声音

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

  }
}
import javax.sound.sampled.*;
公共类音效{
公共静态浮动采样率=8000f;
公共静态无效音调(整数赫兹,整数毫秒)
抛出LineUnavailableException
{
音调(赫兹,毫秒,1.0);
}
公共静态无效音(整数赫兹,整数毫秒,双音量)
抛出LineUnavailableException
{
字节[]buf=新字节[1];
音频格式af=
新音频格式(
采样率,//采样率
8,//示例
1,//通道
true,//已签名
false);//bigEndian
SourceDataLine sdl=AudioSystem.getSourceDataLine(af);
开放式(af);
sdl.start();
对于(int i=0;i

这里有更多合理的实验:

你能解释一下为什么调用clip.start()后我们需要线程休眠吗?我写这段代码已经有一段时间了,但我猜它可能与
线程.yield()同样有效。我指的是为什么我们首先需要阻塞,但我意识到这可能是因为我们会在播放结束前关闭该行。我认为您实际上需要返回到系统资源以使剪辑真正开始。是的,它会在播放结束前关闭该行。这在Linux下可能不起作用。仅供参考,在Windows 10上运行良好。感谢您导入java.awt.Toolkit;在UbuntuLinux上运行良好不在Ubuntu20上运行知道为什么这个答案没有被广泛使用吗?它看起来非常简单和有用…这对我来说是一个极好的解决方案。它在Linux中工作。在第一次尝试时工作得非常好!!