Как остановить клип / объект в определенное время?

1

Привет, Stackoverflow!

Таким образом, в основном, у меня есть два аудиоклипа, которые происходят в моей программе Java, и я хочу, чтобы один из них остановился в определенное время, а другой - в определенное время.

Я постараюсь объяснить код как можно лучше. http://pastebin.com/1zGdb30x Music.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 Program.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 одновременно играют одновременно. Есть ли способ, чтобы мускус играл, останавливался, а затем играл в музыке?

Вещи, которые у меня есть tried- - Имейте оператор if и else в program.java для выполнения clip.stop(). Нет ошибок, это просто не сработало. - Имейте if и else boolean из program.java для выполнения clip.stop() в Music.java. Нет синтаксических ошибок, это просто не сработало.

Теги:
audio
clip

1 ответ

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();
        }
    }
}
  • 0
    Не обязательно то, что я спрашивал, но я вижу, что вы объясняете. Есть ли способ заставить его остановиться до состояния? Спасибо за ваш вклад!
  • 0
    Я не уверен, что ты имеешь в виду под «остановка в состоянии» .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню