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

标签 java audio clip

嗨 Stackoverflow!

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

我会尽力解释代码。 http://pastebin.com/1zGdb30x音乐.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/nGm4DZfr程序.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 boolean 值来执行Music.java 中的clip.stop()。没有语法错误,只是不起作用。

最佳答案

据我理解你的问题,你可以使用 LineListener .

举个例子,这里有一个类,它遍历一个列表,每次当前流完成时播放下一个流:

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();
        }
    }
}

关于java - 如何在特定时间内停止剪辑/对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27086264/

相关文章:

c++ - 为什么 XAudio2 仅在系统暂停时才播放 .wav 文件?

Java3D,如何改变 View 平台剪辑距离?

java - ElasticSearch 服务无法启动。找不到 JVM

java - 如何修复 UnsatisfiedLinkError : dalvik. system.PathClassLoader?

java - 如何检查 URL 中的视频加载情况?

Android 音频开始通过蓝牙 sco 播放缓慢

java - JTree 正在显示应可扩展为叶节点的节点

java - 如何随机播放和播放阵列中的音频文件

svg - 在 flutter 中改变路径的高度和宽度

objective-c - 使用 Cocoa 剪辑到图像蒙版