gpt4 book ai didi

java - 我需要关闭音频剪辑吗?

转载 作者:行者123 更新时间:2023-11-29 08:18:08 24 4
gpt4 key购买 nike

有一个处理实时数据的应用程序,应该在特定事件发生时发出蜂鸣声。触发事件每秒可能发生多次,如果在另一个事件触发时蜂鸣声已经在播放,则代码应该忽略它(而不是中断当前的蜂鸣声并开始新的蜂鸣声)。这是基本代码:

Clip clickClip

public void prepareProcess() {
super.prepareProcess();

clickClip = null;

try {
clipFile = new File("C:/WINDOWS/Media/CHIMES.wav");
ais = AudioSystem.getAudioInputStream(clipFile);
clickClip = AudioSystem.getClip();
clickClip.open(ais);

fileIsLoaded = true;

} catch (Exception ex) {
clickClip = null;
fileIsLoaded = false;
}
}

public void playSound() {

if (fileIsLoaded) {

if ((clickClip==null) || (!clickClip.isRunning())) {

try {
clickClip.setFramePosition(0);
clickClip.start();
} catch (Exception ex) {
System.out.println("Cannot play click noise");
ex.printStackTrace();
}
}
}

prepareProcess 方法一开始运行一次,playSound 方法在每次触发事件发生时被调用。我的问题是:我需要关闭 clickClip 对象吗?我知道我可以添加一个 actionListener 来监视 Stop 事件,但由于该事件发生得如此频繁,我担心额外的处理会减慢实时数据收集的速度。

代码似乎运行良好,但我担心的是内存泄漏。上面的代码是基于我在网上搜索时找到的一个例子,但是这个例子使用了一个actionListener来关闭Clip,特别是“为了消除在没有实现stop方法时会发生的内存泄漏”。我的程序打算运行数小时,因此我遇到的任何内存泄漏都会导致问题。

老实说:我不知道如何验证我是否遇到了问题。我正在使用 Netbeans,运行内存分析器只是给了我一大堆我不知道如何阅读的东西。这应该是程序中最简单的部分,我花了几个小时在上面。任何帮助将不胜感激!

迈克尔

最佳答案

是的,关闭是必要的

  myClip.addLineListener(new LineListener() {
public void update(LineEvent myLineEvent) {
if (myLineEvent.getType() == LineEvent.Type.STOP)
myClip.close();
}
});

或通过

  if (!myClip.isRunning())
myClip.close();

在我的应用程序中(在 util.concurrent 出现之前编写),这是剪辑关闭机制。

  public static final Vector<Clip> vector = new Vector<Clip>();
static final int vector_size = 5;

// typically called before calling play()
static synchronized void consolidate() {
while (vector_size < vector.size()) {
Clip myClip = vector.get(0);
if (myClip.isRunning())
break;
myClip.close();
vector.remove(0);
}
if (vector_size * 2 < vector.size())
System.out.println("warning: audio consolidation lagging");
}

public static void play(final File myFile) {
try {
AudioInputStream myAudioInputStream = AudioSystem.getAudioInputStream(myFile);
final Clip myClip = AudioSystem.getClip();
vector.add(myClip);
myClip.open(myAudioInputStream);
myClip.start();
} catch (Exception myException) {
myException.printStackTrace();
}
}

正如其中一条评论所暗示的,它可能会延迟新剪辑的播放,但我不记得几毫秒的延迟在我的应用程序中并不重要。

关于java - 我需要关闭音频剪辑吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2792977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com