【问题标题】:How to play a sound (alert) in a java application? [duplicate]如何在 Java 应用程序中播放声音(警报)? [复制]
【发布时间】:2011-04-16 09:01:18
【问题描述】:

我正在使用基于 Java 的 SMS 处理软件,并且希望在收到消息时播放哔声/警报声。我尝试查看 java.sound 库但找不到任何东西。我不知道在java应用程序中使用applet方式播放声音是否可以!我们可以在应用程序中调用的任何 Java 库中是否有任何预定义的声音?任何指针将不胜感激!

【问题讨论】:

    标签: java audio


    【解决方案1】:

    如果您只是想要提示音或快速提示,请尝试

    Toolkit.getDefaultToolkit().beep();
    

    【讨论】:

    • 这在 Linux 下可能不起作用。
    • 仅供参考,在 Windows 10 上运行良好。谢谢
    • 导入 java.awt.Toolkit;
    • 在 ubuntu linux 上运行良好
    • 无法在 ubuntu 20 上运行
    【解决方案2】:

    如果您寻找比没有外部声音文件的 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);
    
      }
    }
    

    更多声音实验在这里:Produce special sound effect

    【讨论】:

      【解决方案3】:

      小程序路径应该没问题(并且非常简单)。为避免创建 Applet 实例,您可以使用静态 newAudioClip 方法,然后在创建的 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

      【讨论】:

      • 知道为什么这个答案没有被广泛使用吗?看起来非常简单实用……
      • 这对我来说是一个很好的解决方案。
      • 这适用于 Linux。
      • 第一次尝试效果很好!
      【解决方案4】:

      可以看一下Toolkit类中的beep方法,如图here

      【讨论】:

        【解决方案5】:

        如果你想使用声音包播放任意声音文件,你可以使用javax.sound.sampled包。下面是播放声音文件的代码:

        私人无效playSound(文件f){ 可运行 r = new Runnable() { 私人文件 f; 公共无效运行(){ playSoundInternal(this.f); } 公共可运行 setFile(文件 f){ 这.f = f; 返回这个; } }.setFile(f); 新线程(r).start(); } 私人无效playSoundInternal(文件f){ 尝试 { AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(f); 尝试 { 剪辑剪辑 = AudioSystem.getClip(); 剪辑.打开(音频输入流); 尝试 { 剪辑.start(); 尝试 { 线程.sleep(100); } 捕捉(InterruptedException e){ e.printStackTrace(); } 剪辑.漏(); } 最后 { 剪辑.close(); } } 捕捉(LineUnavailableException e){ e.printStackTrace(); } 最后 { 音频输入流.close(); } } 捕捉(UnsupportedAudioFileException e){ e.printStackTrace(); } 捕捉(FileNotFoundException e){ e.printStackTrace(); } 捕捉(IOException e){ e.printStackTrace(); } }

        【讨论】:

        • 你能解释一下为什么我们在调用clip.start()之后需要线程休眠吗?
        • 我写这段代码已经有一段时间了,但我猜它可能与Thread.yield() 一样好用。
        • 我指的是为什么我们首先需要阻止,但我意识到这可能是因为我们会在播放完之前关闭线路
        • 我认为您实际上需要传回系统资源才能使剪辑真正开始。
        • 是的,它会在播放完之前关闭线路。
        猜你喜欢
        • 2018-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多