gpt4 book ai didi

java - 如何在连续按下 JButton 的同时使用 Clip 更流畅地播放音频文件

转载 作者:行者123 更新时间:2023-12-02 01:09:36 24 4
gpt4 key购买 nike

我自学 Java 已有一年了,现在我正在尝试创建一个采样器设备。这是我的第二个 java 项目,我陷入了如何在连续点击 JButton 的同时流畅地播放音频文件的困境。每次我按下 J 按钮时,音频样本都会从头开始,该按钮工作正常,直到样本即将结束。因此,在剪辑完成之前,我按下 JButton,从头开始播放,但它不起作用,在剪辑结束后,我按下 JButton,它再次正常工作。谁能告诉我如何解决这个问题?

类 Drumthread 扩展 JFrame 实现 ActionListener、LineListener {

JButton button1;
AudioFormat format;
Clip clip;

File audio1 = new File (samplefile);

Drumthread() {

AudioInputStream stream1 = AudioSystem.getAudioInputStream(audio1);
format = new AudioFormat(44100, 16, 2, true, false);

DataLine.Info clipinfo = new DataLine.Info(Clip.class, format);
clip = (Clip) AudioSystem.getLine(clipinfo);
clip.open(stream1);
clip.addLineListener(this);


button1 = new JButton("1");
add(button1);
button1.addActionListener(this);


setVisible(true);

}

public void update(LineEvent event) {
// TODO Auto-generated method stub

if (event.getType() == LineEvent.Type.STOP && event.getLine().equals(clip)) {
clip.stop();
clip.setFramePosition(0);
}

}

public void actionPerformed(ActionEvent evt) {
// TODO Auto-generated method stub

String play = evt.getActionCommand();

if(play == "1") {
clip.start();
}
if(play == "1" && clip.isRunning()){
clip.setFramePosition(0);
}
}

}}

最佳答案

我来大胆猜测一下。 actionPerformedif 语句的突破对我来说似乎很可疑。

考虑以下场景:剪辑正在播放并接近播放结束。

在这种情况下,第一个 if 条件将为 true,并且 start 方法将执行。这将无济于事。来自 API :“如果在已经运行的线路上调用,此方法不会执行任何操作。”

然后执行第二个 if 语句。当剪辑接近结尾时,剪辑可能会在 if 条件测试时间和 setFramePosition 执行时间之间完成播放。这种情况可以被视为“竞争条件”,这是多线程编码的常见危险。在这种情况下,两个并发运行的线程一个执行测试,一个执行剪辑的播放。

如果播放线程“赢得”了比赛,则播放将在剪辑位置重置为 0 之前结束,并且剪辑最终会停止为 0。

我建议让 actionPerformed 方法停止播放,移动位置并在每次单击按钮时重新启动,无论剪辑的状态如何。

对代码的另一个建议是,LineListenerupdate 条件仅在剪辑停止时才测试和执行。因此,为剪辑提供 stop 方法应该是多余的。

我的一点编辑:Java 的 javax.sound.sampled 库使我们能够访问强大的、低延迟的音频编码。我对此感到非常满意和成功,并且个人认为 Java 作为音频项目的工具被低估了。 (大多数人更喜欢 C++。)我希望您也能从中获得乐趣!

关于java - 如何在连续按下 JButton 的同时使用 Clip 更流畅地播放音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57698426/

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