Привет, 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. Нет синтаксических ошибок, это просто не сработало.
Как я понимаю ваш вопрос, вы можете использовать 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();
}
}
}