Javas Audio的问题剪辑频繁播放哔声
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Javas Audio的问题剪辑频繁播放哔声,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3091字,纯文字阅读大概需要5分钟。
内容图文
![Javas Audio的问题剪辑频繁播放哔声](/upload/InfoBanner/zyjiaocheng/701/03a08b166efa49c9b3c6f72197f14dfd.jpg)
我想播放短蜂鸣声(WAV文件)成功和GUI触发动作的错误.
我遇到了javax.sound.sampled.Clip,这似乎有效.
这是我使用的基本代码:
clip.stop();
clip.setFramePosition(0);
clip.start();
在按钮单击触发数据库操作后执行此操作.在成功和错误上播放两个不同的预加载剪辑.
但是在生产机器(运行Kubuntu 10.4的旧PC)一段时间后(大约400次执行或2-4小时),剪辑拒绝播放.
停止方法需要大约3秒才能终止,并且后续启动操作不会播放任何声音.以下每次调用代码都会失败,而不会抛出异常或任何其他反馈.
解决这个问题的唯一方法是重新启动整个应用程序.
我的问题是:
这有什么解决方法吗?还有其他人有同样的问题吗?或者是否有另一个框架我可以用来播放至少两种不同的声音(Toolkit.beep()只能播放一种声音).
解决方法:
不要害怕只是重新创建对象,开销很低.不要重置剪辑,只需创建新剪辑即可.您可以缓存文件,这将是一个有用的优化.重复使用剪辑对象不是.
或者你可以尝试另一种实现[不受限制].
这是谷歌“java play wav files”的最佳结果:
http://www.anyexample.com/programming/java/java_play_wav_sound_file.xml
它简化了一次通话:
new AePlayWave("test.wav").start();
只需将此类添加到您的代码库:
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
public class AePlayWave extends Thread {
private String filename;
private Position curPosition;
private final int EXTERNAL_BUFFER_SIZE = 524288; // 128Kb
enum Position {
LEFT, RIGHT, NORMAL
};
public AePlayWave(String wavfile) {
filename = wavfile;
curPosition = Position.NORMAL;
}
public AePlayWave(String wavfile, Position p) {
filename = wavfile;
curPosition = p;
}
public void run() {
File soundFile = new File(filename);
if (!soundFile.exists()) {
System.err.println("Wave file not found: " + filename);
return;
}
AudioInputStream audioInputStream = null;
try {
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
} catch (UnsupportedAudioFileException e1) {
e1.printStackTrace();
return;
} catch (IOException e1) {
e1.printStackTrace();
return;
}
AudioFormat format = audioInputStream.getFormat();
SourceDataLine auline = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
try {
auline = (SourceDataLine) AudioSystem.getLine(info);
auline.open(format);
} catch (LineUnavailableException e) {
e.printStackTrace();
return;
} catch (Exception e) {
e.printStackTrace();
return;
}
if (auline.isControlSupported(FloatControl.Type.PAN)) {
FloatControl pan = (FloatControl) auline
.getControl(FloatControl.Type.PAN);
if (curPosition == Position.RIGHT)
pan.setValue(1.0f);
else if (curPosition == Position.LEFT)
pan.setValue(-1.0f);
}
auline.start();
int nBytesRead = 0;
byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
try {
while (nBytesRead != -1) {
nBytesRead = audioInputStream.read(abData, 0, abData.length);
if (nBytesRead >= 0)
auline.write(abData, 0, nBytesRead);
}
} catch (IOException e) {
e.printStackTrace();
return;
} finally {
auline.drain();
auline.close();
}
}
}
内容总结
以上是互联网集市为您收集整理的Javas Audio的问题剪辑频繁播放哔声全部内容,希望文章能够帮你解决Javas Audio的问题剪辑频繁播放哔声所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。