如何在方法之外制作剪辑?
How do I make a clip outside of method?
我创建了一个在调用时启动或停止音乐的方法,但如果我多次调用它,它会启动一个重复的剪辑。我找不到如何在变量之外制作音频剪辑变量来防止这种情况。
public static void playSound(boolean play) throws Exception {
File sound = new File("wave.wav");
Clip clip = AudioSystem.getClip();
if(play=true) {
AudioInputStream inputStream = AudioSystem.getAudioInputStream(sound);
inputStream = AudioSystem.getAudioInputStream(sound);
clip.open(inputStream);
clip.loop(Clip.LOOP_CONTINUOUSLY);
clip.start();
} else if (play=false) {
clip.stop();
}
}
更新:
因此,经过几个小时的尝试,我决定将启动音乐的代码放在 main 方法中,将 clip 变量设为静态(这样 eclipse 就会让我在事件中使用它),然后使用 clip.stop() on事件。只是想我会分享。
您的直接问题是 if(play=true) {
,这是将 play
设置为 true
,因此每次都会重新打开剪辑并重新开始播放。
您应该使用 if(play==true) {
来确定 play
的值是否为 true
,但您也可以使用 if(play) {
查看 The if-then and if-then-else Statements 了解更多详情。
本质上,=
是赋值==
是求值。 if 条件必须等于布尔值 (true
/false
),因此在使用布尔值时,您不必使用 ==
,您可以直接使用该值本身。
假设 play
是 true
,if (play == true)
和 if (play)
都将计算为 true
话虽如此,一旦你初始化并打开剪辑,你就不需要 re-open 再次开始播放时,例如...
public class Track {
private Clip clip;
private File source;
public Track(File source) {
this.source = source;
}
public static void playSound(boolean play) throws Exception {
File sound = new File("wave.wav");
Clip clip = AudioSystem.getClip();
if (play = true) {
AudioInputStream inputStream = AudioSystem.getAudioInputStream(sound);
inputStream = AudioSystem.getAudioInputStream(sound);
clip.open(inputStream);
clip.loop(Clip.LOOP_CONTINUOUSLY);
clip.start();
} else if (play = false) {
clip.stop();
}
}
public File getSource() {
return source;
}
public Clip getClip() {
return clip;
}
public void play() throws LineUnavailableException, UnsupportedAudioFileException, IOException {
if (clip == null) {
AudioInputStream inputStream = AudioSystem.getAudioInputStream(getSource());
inputStream = AudioSystem.getAudioInputStream(getSource());
}
if (!clip.isOpen()) {
clip.open();
}
clip.loop(Clip.LOOP_CONTINUOUSLY);
clip.start();
}
public void stop() {
if (clip == null) {
return;
}
if (!clip.isActive()) {
return;
}
clip.stop();
clip.setFramePosition(0);
}
}
事实上,您还可以轻松地添加对暂停的支持,方法是
public void pause() {
if (clip == null) {
return;
}
if (!clip.isActive()) {
return;
}
clip.stop();
}
(ps - 我没有添加关闭方法,这也很有用)
除了更完整的答案外,还可以让语句读起来像
if(play)
{
// Play code
}
else
{
clip.stop();
}
而不是
if(play == true)
{
// Play code
}
else if(play == false)
{
clip.stop();
}
是更好的风格。
编辑以获取更多信息
要回答问题的标题,
How do I make a clip outside of method?
我相信您是在问如何格式化 class-level 变量。这需要满足以下条件:
- 访问修饰符,需要 -- 默认(当你什么都不输入时),public,protected,private
- final 关键字,可选 -- 用于限制用户
- static 关键字,可选 -- 用于内存管理
- 数据类型,需要--指定变量可以存储的不同大小和值
- name, need -- 如何调用或引用变量。不能在保留关键字列表中
使用与此调用相同的 class:Clip clip = AudioSystem.getClip();
,您可以创建一个空的 class-level 变量:
private static Object objectName;
链接
我创建了一个在调用时启动或停止音乐的方法,但如果我多次调用它,它会启动一个重复的剪辑。我找不到如何在变量之外制作音频剪辑变量来防止这种情况。
public static void playSound(boolean play) throws Exception {
File sound = new File("wave.wav");
Clip clip = AudioSystem.getClip();
if(play=true) {
AudioInputStream inputStream = AudioSystem.getAudioInputStream(sound);
inputStream = AudioSystem.getAudioInputStream(sound);
clip.open(inputStream);
clip.loop(Clip.LOOP_CONTINUOUSLY);
clip.start();
} else if (play=false) {
clip.stop();
}
}
更新: 因此,经过几个小时的尝试,我决定将启动音乐的代码放在 main 方法中,将 clip 变量设为静态(这样 eclipse 就会让我在事件中使用它),然后使用 clip.stop() on事件。只是想我会分享。
您的直接问题是 if(play=true) {
,这是将 play
设置为 true
,因此每次都会重新打开剪辑并重新开始播放。
您应该使用 if(play==true) {
来确定 play
的值是否为 true
,但您也可以使用 if(play) {
查看 The if-then and if-then-else Statements 了解更多详情。
本质上,=
是赋值==
是求值。 if 条件必须等于布尔值 (true
/false
),因此在使用布尔值时,您不必使用 ==
,您可以直接使用该值本身。
假设 play
是 true
,if (play == true)
和 if (play)
都将计算为 true
话虽如此,一旦你初始化并打开剪辑,你就不需要 re-open 再次开始播放时,例如...
public class Track {
private Clip clip;
private File source;
public Track(File source) {
this.source = source;
}
public static void playSound(boolean play) throws Exception {
File sound = new File("wave.wav");
Clip clip = AudioSystem.getClip();
if (play = true) {
AudioInputStream inputStream = AudioSystem.getAudioInputStream(sound);
inputStream = AudioSystem.getAudioInputStream(sound);
clip.open(inputStream);
clip.loop(Clip.LOOP_CONTINUOUSLY);
clip.start();
} else if (play = false) {
clip.stop();
}
}
public File getSource() {
return source;
}
public Clip getClip() {
return clip;
}
public void play() throws LineUnavailableException, UnsupportedAudioFileException, IOException {
if (clip == null) {
AudioInputStream inputStream = AudioSystem.getAudioInputStream(getSource());
inputStream = AudioSystem.getAudioInputStream(getSource());
}
if (!clip.isOpen()) {
clip.open();
}
clip.loop(Clip.LOOP_CONTINUOUSLY);
clip.start();
}
public void stop() {
if (clip == null) {
return;
}
if (!clip.isActive()) {
return;
}
clip.stop();
clip.setFramePosition(0);
}
}
事实上,您还可以轻松地添加对暂停的支持,方法是
public void pause() {
if (clip == null) {
return;
}
if (!clip.isActive()) {
return;
}
clip.stop();
}
(ps - 我没有添加关闭方法,这也很有用)
除了更完整的答案外,还可以让语句读起来像
if(play)
{
// Play code
}
else
{
clip.stop();
}
而不是
if(play == true)
{
// Play code
}
else if(play == false)
{
clip.stop();
}
是更好的风格。
编辑以获取更多信息
要回答问题的标题,
How do I make a clip outside of method?
我相信您是在问如何格式化 class-level 变量。这需要满足以下条件:
- 访问修饰符,需要 -- 默认(当你什么都不输入时),public,protected,private
- final 关键字,可选 -- 用于限制用户
- static 关键字,可选 -- 用于内存管理
- 数据类型,需要--指定变量可以存储的不同大小和值
- name, need -- 如何调用或引用变量。不能在保留关键字列表中
使用与此调用相同的 class:Clip clip = AudioSystem.getClip();
,您可以创建一个空的 class-level 变量:
private static Object objectName;
链接