如何在特定时间内停止剪辑/对象?

Posted

技术标签:

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

你好 ***!

所以基本上,我的 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()。没有语法错误,只是没有用。

【问题讨论】:

【参考方案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 播放?”,这是我试图回答的问题。如果这不能回答您的问题,那么您应该对其进行编辑并充分解释自己。

以上是关于如何在特定时间内停止剪辑/对象?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PlayOneShot 时如何停止音频

Flash as3如何通过鼠标事件停止播放子电影剪辑?

HTML5 音频:如何快速停止和重新启动剪辑?

如何在qml中沿特定路径剪辑图像

如何从特定索引映射然后在特定索引之后停止[重复]

如何根据循环内的特定条件使用 Array.map 迭代停止索引计数增量?