【问题标题】:How to halt a clip/object in a certain time?如何在特定时间内停止剪辑/对象?
【发布时间】:2014-11-23 06:30:49
【问题描述】:

你好 Stackoverflow!

所以基本上,我的 Java 程序中有两个音频剪辑正在进行,我希望其中一个在某个时间停止,另一个在某个时间开始。

我会尽力解释代码。 http://pastebin.com/1zGdb30xMusic.java

    package testingground;


import java.io.IOException;
import java.net.URL;

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;


public class Music {
    public void musictwo() {
        URL url;
        try {
            url = new URL("file:///D:/Yes/GUI/song.wav");
             Clip clip = AudioSystem.getClip();
            AudioInputStream ais = AudioSystem.
              getAudioInputStream( url );
            clip.open(ais);
            clip.loop(100);

        } catch (UnsupportedAudioFileException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (LineUnavailableException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


    public void musicone() {
        URL url;
        try {
            url = new URL("file:///D:/Yes/GUI/rival.wav");
            Clip clip = AudioSystem.getClip();
            AudioInputStream ais = AudioSystem.
              getAudioInputStream( url );
            clip.open(ais);
            clip.loop(100);
        } catch (UnsupportedAudioFileException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (LineUnavailableException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

http://pastebin.com/nGm4DZfrProgram.java

package testingground;

import javax.swing.JOptionPane;

public class Program {
    public static void main(String[] args) {
        System.out.println("The first song should play now!");
        Music a = new Music();
        a.musicone();
        System.out.println("The second song should play now!");
        a.musictwo();
        JOptionPane.showMessageDialog(null,"Press 'ok' to end the application.");
    }
}

在 Music.java 中,我可以使用音频文件,它们只是本地 .wav 文件,只能在我的计算机上使用。在 program.java 中,输出为 musicone 和 musictwo 同时播放。有没有办法让muscone播放,停止,然后musictwo播放?

我尝试过的事情- - 在 program.java 中有一个 if 和 else 语句来执行 clip.stop()。没有错误,它只是没有工作。 - 使用 program.java 中的 if 和 else 布尔值在 Music.java 中执行 clip.stop()。没有语法错误,只是没有用。

【问题讨论】:

    标签: java audio clip


    【解决方案1】:

    按照我理解您的问题的方式,您可以使用LineListener

    例如,这里有一个类,它通过一个 List,每次当前流完成时播放下一个流:

    class Playlist implements LineListener {
        private final List<AudioInputStream> list = new ArrayList<>();
        private Clip clip;
        private int next;
    
        @Override
        public void update(LineEvent evt) {
            if(evt.getType() == LineEvent.STOP) {
                try {
                    playNext();
                } catch(LineUnavailableException | IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        void enqueue(AudioInputStream ais) {
            synchronized(this) {
                list.add(ais);
            }
        }
    
        void playNext() throws LineUnavailableException, IOException {
            synchronized(this) {
                if(list.isEmpty()) {
                    throw new IllegalStateException();
                }
                if(clip != null) {
                    if(clip.isRunning()) clip.stop();
                    if(clip.isOpen()) clip.close();
                }
    
                clip = AudioSystem.getClip();
                clip.addLineListener(listener);
                try {
                    clip.open(list.get(next));
                } finally {
                    next = (next + 1) % list.size();
                }
                clip.start();
            }
        }
    }
    

    【讨论】:

    • 不一定是我要问的,但我明白你在解释什么。有没有办法让它停下来?感谢您的意见!
    • 我不确定你所说的'停止条件'是什么意思。
    • 音乐播放; if(条件) { musicStops }
    • 在我的例子中...if(condition) thePlaylist.playNext();。现在,您的问题是“有没有办法让muscone 播放,停止,然后musictwo 播放?”,这是我试图回答的问题。如果这不能回答您的问题,那么您应该对其进行编辑并充分解释自己。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多