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