Java 如何停止音乐剪辑?
我正在和一些同学一起做一个游戏,到目前为止,除了音乐之外,我们已经把所有的东西都编好了。java类发布在下面 我们在停止播放声音时遇到问题,因此我需要一种方法来停止播放此剪辑,以便我们可以实际开始另一个剪辑,这样我们可以在游戏中切换音乐(例如,当您开始游戏时,歌曲应该与主菜单不同) 即使我可以破坏这个物体来制造一个新的,如果有可能的话,我愿意这么做,但我不知道怎么做。我希望能够停止当前的剪辑文件,并用一个新的替换它Java 如何停止音乐剪辑?,java,eclipse,audio,Java,Eclipse,Audio,我正在和一些同学一起做一个游戏,到目前为止,除了音乐之外,我们已经把所有的东西都编好了。java类发布在下面 我们在停止播放声音时遇到问题,因此我需要一种方法来停止播放此剪辑,以便我们可以实际开始另一个剪辑,这样我们可以在游戏中切换音乐(例如,当您开始游戏时,歌曲应该与主菜单不同) 即使我可以破坏这个物体来制造一个新的,如果有可能的话,我愿意这么做,但我不知道怎么做。我希望能够停止当前的剪辑文件,并用一个新的替换它 package sound; import java.io.File; imp
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中,我创建了一个新的音乐对象,通过playSiren方法我给出了我的歌曲名,然后它自动运行。查看
数据线.stop()
方法<代码>剪辑实现数据线
例如ClipControl.java
@Andrew抱歉再次打扰你,我可以看到你是如何在同一节课上停止剪辑的,但你也可以在另一节课上停止吗?@Andrew抱歉再次打扰你,我可以看到你是如何在同一节课上停止剪辑的,但你也可以在另一节课上停止剪辑吗?因为我不知道当一个面板变得可见时我该怎么做@乔纳森:“你在同一节课上停止了剪辑”,事实并非如此。编译该源代码时,将生成3个类。第一个是
ClipControl.class
,在这里创建Clip
。第二个和第三个是匿名内部类,名称为ClipControl$1.class
,用于Runnable
,ClipControl$1.class
,用于ActionListener
。在ActionListener
中,Clip
被切换为开始/停止。但最终,这并不是关于声音片段,而是关于成员的可见性和代码的设计。也许你应该开始一个新的问题。@andrew非常感谢你在这件事上的帮助,我认为我们从中得到了更多的智慧,仍然在想如何做,因为我们不需要按钮来切换音乐,所以我们不能在那个剪辑上放一个actionListener,但非常感谢^^我们会想出办法的
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);
}
}