gpt4 book ai didi

java - 在Java中,当另一个音频文件开始使用key_events时,如何停止前一个音频文件

转载 作者:太空宇宙 更新时间:2023-11-04 06:51:43 25 4
gpt4 key购买 nike

我知道clip.stop()方法,但是当我将它放在key_events中时它似乎不起作用。它只会导致错误。好吧,我知道为什么会导致错误。因为我要求它基本上停止几行之后才存在的剪辑。但是使用相同的逻辑或接近它(如果可能),我如何重新编码,以便它知道选择从上一个 key_event 播放的上一个剪辑。我想要的功能是:当按下 F1 时,会播放 wav 音乐。当按下 F2 时,当前的 wav 停止,新的 wav 开始。当按下 F3 时,当前的 wav 停止,新的 wav 开始。等等等等等等

            case KeyEvent.VK_F1:

try {

//stop any sound
clip.stop();

sample = AudioSystem.getAudioInputStream(getURL(filename));

//create a sound buffer
Clip clip = AudioSystem.getClip();

//load the audio file
clip.open(sample);

//play sample
clip.start();

} catch (MalformedURLException ez) {
} catch (IOException ez) {
} catch (LineUnavailableException ez) {
} catch (UnsupportedAudioFileException ez) {
} catch (Exception ez) { }

break;


case KeyEvent.VK_F2:

try {

//stop any sound
clip.stop();

sample = AudioSystem.getAudioInputStream(getURL(filename2));

//create a sound buffer
Clip clip = AudioSystem.getClip();

//load the audio file
clip.open(sample);

//play sample
clip.start();

} catch (MalformedURLException ez) {
} catch (IOException ez) {
} catch (LineUnavailableException ez) {
} catch (UnsupportedAudioFileException ez) {
} catch (Exception ez) { }

break;

case KeyEvent.VK_F3:

try {

//stop any sound
clip.stop();

sample = AudioSystem.getAudioInputStream(getURL(filename3));

//create a sound buffer
Clip clip = AudioSystem.getClip();

//load the audio file
clip.open(sample);

//play sample
clip.start();

} catch (MalformedURLException ez) {
} catch (IOException ez) {
} catch (LineUnavailableException ez) {
} catch (UnsupportedAudioFileException ez) {
} catch (Exception ez) { }

break;

case KeyEvent.VK_F4:

try {

//stop any sound
clip.stop();

sample = AudioSystem.getAudioInputStream(getURL(filename4));

//create a sound buffer
Clip clip = AudioSystem.getClip();

//load the audio file
clip.open(sample);

//play sample
clip.start();

} catch (MalformedURLException ez) {
} catch (IOException ez) {
} catch (LineUnavailableException ez) {
} catch (UnsupportedAudioFileException ez) {
} catch (Exception ez) { }

break;

case KeyEvent.VK_F5:

try {

//stop any sound
clip.stop();

sample = AudioSystem.getAudioInputStream(getURL(filename5));

//create a sound buffer
Clip clip = AudioSystem.getClip();

//load the audio file
clip.open(sample);

//play sample
clip.start();

} catch (MalformedURLException ez) {
} catch (IOException ez) {
} catch (LineUnavailableException ez) {
} catch (UnsupportedAudioFileException ez) {
} catch (Exception ez) { }

break;

case KeyEvent.VK_F6:

try {

//stop any sound
clip.stop();

sample = AudioSystem.getAudioInputStream(getURL(filename6));

//create a sound buffer
Clip clip = AudioSystem.getClip();

//load the audio file
clip.open(sample);

//play sample
clip.start();

} catch (MalformedURLException ez) {
} catch (IOException ez) {
} catch (LineUnavailableException ez) {
} catch (UnsupportedAudioFileException ez) {
} catch (Exception ez) { }

break;

case KeyEvent.VK_F7:

try {

//stop any sound
clip.stop();

sample = AudioSystem.getAudioInputStream(getURL(filename7));

//create a sound buffer
Clip clip = AudioSystem.getClip();

//load the audio file
clip.open(sample);

//play sample
clip.start();

} catch (MalformedURLException ez) {
} catch (IOException ez) {
} catch (LineUnavailableException ez) {
} catch (UnsupportedAudioFileException ez) {
} catch (Exception ez) { }

break;

任何帮助将不胜感激:)谢谢

最佳答案

很难百分百确定,但看起来您正在隐藏变量...

clip.stop();

sample = AudioSystem.getAudioInputStream(getURL(filename));

//create a sound buffer
Clip clip = AudioSystem.getClip();

事实上,我什至不确定这将如何编译......

定义Clip为实例变量,程序初始化时,同时初始化Clip

您应该可以随时调用 stop,但这只会将 Clip 重置回当前输入的开头。您还需要做的是关闭 Clip,这会释放由 Clip 为当前输入管理的内部资源...

KeyListener 也是出了名的麻烦,您应该考虑使用 Key Bindings因为它们为您提供了控制来确定可以生成关键事件的焦点级别,例如......

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestPlayer {

public static void main(String[] args) {
new TestPlayer();
}

public TestPlayer() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

try {
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (LineUnavailableException exp) {
exp.printStackTrace();
}
}
});
}

public class TestPane extends JPanel {

private Clip clip;
private List<File> playList;
private int index;

private JLabel label;

public TestPane() throws LineUnavailableException {
label = new JLabel("Play stuff");
add(label);
clip = AudioSystem.getClip();

File[] files = new File("A folder of music files").listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.getName().toLowerCase().endsWith(".wav");
}
});
playList = new ArrayList<>(Arrays.asList(files));
index = -1;

InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "previous");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "next");

ActionMap am = getActionMap();
am.put("next", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
playNext();
}
});
am.put("previous", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
playPrevious();
}
});
}

public void playNext() {
index++;
if (index >= playList.size()) {
index = 0;
}

File file = playList.get(index);

play(file);
}

public void playPrevious() {
index--;
if (index < 0) {
index = playList.size() - 1;
}

File file = playList.get(index);

play(file);
}

public void play(File file) {

try {
stop();
label.setText(file.getName());
AudioInputStream sample = AudioSystem.getAudioInputStream(file);
clip.open(sample);
clip.start();
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException exp) {
exp.printStackTrace();
}
}

public void stop() {

clip.stop();
clip.close();

}

}

}

关于java - 在Java中,当另一个音频文件开始使用key_events时,如何停止前一个音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23232683/

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