如何在Java中停止音乐片段?

我正在和一些同学一起玩游戏,我们已经编写了除音乐之外的所有内容,直到现在。 music.java类发布在下面。

我们在停止声音方面遇到了问题,所以我需要一种方法来停止播放这个片段,这样我们才能真正开始播放另一个片段,这样我们就可以在游戏过程中转换音乐(比如当你开始游戏时,这首歌应该是不同的从主菜单)。 有人可以帮我解决这个问题吗?

即使我可以摧毁对象来制作一个新对象,如果有可能,我愿意这样做,但我不知道如何做到这一点。 我宁愿有可能停止当前的剪辑文件,并用新的替换它。

package sound; 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.Clip; import javax.sound.sampled.DataLine; import javax.sound.sampled.FloatControl; import javax.sound.sampled.LineEvent; import javax.sound.sampled.LineListener; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException; public class Music implements LineListener, Runnable { private File soundFile; private Thread thread; private static Music player; private Music audio; private Clip clip; private boolean stoppen = false; /** * Private because of the singleton */ public Music() { } /** * Play a siren sound */ public void playSiren(String musicFileName) { audio = getPlayer(); audio.playSirenFile(musicFileName); } /** * Play the siren file */ private void playSirenFile(String musicFileName) { this.soundFile = new File("Music/"+musicFileName+".wav"); thread = new Thread(this); thread.setName("SoundPlayer"); thread.start(); } /** * Invoked when the thread kicks off */ public void run() { try { AudioInputStream stream = AudioSystem.getAudioInputStream(this.soundFile); AudioFormat format = stream.getFormat(); /** * we can't yet open the device for ALAW/ULAW playback, convert * ALAW/ULAW to PCM */ if ((format.getEncoding() == AudioFormat.Encoding.ULAW) || (format.getEncoding() == AudioFormat.Encoding.ALAW)) { AudioFormat tmp = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, format.getSampleRate(), format.getSampleSizeInBits() * 2, format.getChannels(), format.getFrameSize() * 2, format.getFrameRate(), true); stream = AudioSystem.getAudioInputStream(tmp, stream); format = tmp; } DataLine.Info info = new DataLine.Info(Clip.class, stream .getFormat(), ((int) stream.getFrameLength() * format .getFrameSize())); this.clip = (Clip) AudioSystem.getLine(info); this.clip.addLineListener(this); this.clip.open(stream); this.clip.start(); try { thread.sleep(99); } catch (Exception e) { } while (clip.isActive() && thread != null) { try { thread.sleep(99); } catch (Exception e) { break; } } clip.loop(999999999); clip.drain(); } catch (UnsupportedAudioFileException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (LineUnavailableException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static Music getPlayer() { if (player == null) { player = new Music(); } return player; } public void update(LineEvent event) { } public void stopClip() { //TODO NEED HELP HERE } public void startClip() { //TODO need help here } public void volume(float volume) { //TODO NEED HELP HERE /* FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); gainControl.setValue(-50.0f); // Reduce volume IN DECIBELS clip.start(); */ } } 

你可能需要知道的东西:

在我的GuiController中,我创建了一个新的Music对象,通过playSiren方法我给出了我的歌名,然后它自动运行。

查看DataLine.stop()方法。 Clip实现了DataLine


EG ClipControl.java

 import java.awt.event.*; import javax.swing.*; import javax.sound.sampled.*; import java.net.URL; class ClipControl { public static void main(String[] args) throws Exception { URL url = new URL("http://pscode.org/media/leftright.wav"); AudioInputStream ais = AudioSystem.getAudioInputStream(url); final Clip clip = AudioSystem.getClip(); clip.open( ais ); Runnable r = new Runnable() { public void run() { final JToggleButton startStop = new JToggleButton("Stop"); startStop.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent ae) { if (startStop.isSelected()) { clip.stop(); startStop.setText("Start"); } else { clip.loop(-1); clip.start(); startStop.setText("Stop"); } } } ); clip.loop(-1); JOptionPane.showMessageDialog(null, startStop); } }; SwingUtilities.invokeLater(r); } }