Остановить / отключить воспроизведение музыки с помощью JLayer
Я использую jlayer для воспроизведения mp3-файлов в моей программе, но в документации по jlayer я не смог найти никакой полезной информации об остановке воспроизведения музыки и продолжении с того места, где она была остановлена. есть идеи?
моя программа выглядит следующим образом:
package sounds;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import javazoom.jl.player.Player;
/**
* Wayne, K. (2005). How to Play an MP3 File in Java.
* Available: http://introcs.cs.princeton.edu/faq/mp3/mp3.html.
* Last accessed 10th Mar 2011.
* @author temelm
*/
public class MP3 {
private String filename;
private Player player;
/**
* MP3 constructor
* @param filename name of input file
*/
public MP3(String filename) {
this.filename = filename;
}
/**
* Creates a new Player
*/
public void play() {
try {
FileInputStream fis = new FileInputStream(this.filename);
BufferedInputStream bis = new BufferedInputStream(fis);
this.player = new Player(bis);
} catch (Exception e) {
System.err.printf("%s\n", e.getMessage());
}
new Thread() {
@Override
public void run() {
try {
player.play();
} catch (Exception e) {
System.err.printf("%s\n", e.getMessage());
}
}
}.start();
}
/**
* Closes the Player
*/
public void close() {
if (this.player != null) {
this.player.close();
}
}
/////////////////////////
/**
* Plays '01 Maenam.mp3' in an infinite loop
*/
public static void playMaenam() {
MP3 mp3 = new MP3("./01 Maenam.mp3");
mp3.play();
while (true) {
if (mp3.player.isComplete()) {
mp3.close();
mp3.play();
}
}
}
}
3 ответа
Я получаю свои mp3 из файла InputStream. Когда я хочу сделать паузу, я делаю (fis это fileinputstream) fis.available() (или что-то подобное). Это дает количество байтов, оставшихся в потоке... Если вы сделаете это до его запуска, вы получите общую длину. Итого осталось - сумма, оставшаяся в данный момент = Текущая позиция Затем я просто создаю новый входной поток и делаю fis.skip(theamount); возобновить.. Ужасный метод, но да, это работает..
Просто проигрывайте один кадр за раз в потоке, если установлен флаг "пауза", а затем приостановите поток...
Приведенный ниже код приостанавливает / возобновляет поток проигрывателя, если нажата клавиша ввода (в консоли) и "выход" для завершения приложения.
final AtomicBoolean pause = new AtomicBoolean(false);
final Player player = new Player(bis);
Thread playerThread = new Thread() {
@Override
public void run() {
try {
while (player.play(1)) {
if(pause.get()) {
LockSupport.park();
}
}
}
catch (Exception e) {
System.err.printf("%s\n", e.getMessage());
}
}
};
playerThread.start();
Scanner scanner = new Scanner(System.in);
String s = null;
while (!(s = scanner.nextLine()).equals("exit")) {
if (s.isEmpty()) {
pause.set(!pause.get());
if (!pause.get()) {
LockSupport.unpark(playerThread);
}
}
}
System.exit(0);