Java Jlayer Mp3 Player - как повторить и остановить песню
Я извиняюсь за мой плохой английский:) У меня проблема с mp 3 игроком. Я использую jLayer. Это мой код
private void formWindowOpened(java.awt.event.WindowEvent evt) {
new Thread (){
public void run(){
try
{
Player prehravac;
FileInputStream buff = new FileInputStream(Okno.filename);
prehravac = new Player(buff);
prehravac.play();
if (prehravac != null)
{
prehravac.play();
}
}
catch(Exception e)
{
}
}
}.start();
}
В моем приложении мне нужно играть песню от начала до конца. Поэтому, когда песня заканчивается, мне нужно запустить ее снова, а когда окно закроется, я хочу остановить эту песню...
Может кто-нибудь помочь мне с этим, пожалуйста?:) Я пытаюсь сделать это в течение 2 дней... Я не знаю, как остановить что-то в другой теме... Спасибо за вашу помощь:)
1 ответ
JLayer не поддерживает непрерывное воспроизведение, поэтому вы должны использовать цикл, чтобы повторно запустить нового игрока после того, как старый закончится. Например:
try
{
do
{
FileInputStream buff = new FileInputStream(Okno.filename);
prehravac = new AdvancedPlayer(buff );
prehravac .play();
}while(loop);
}
catch(Exception ioe)
{
//TODO error handling
}
с булевым циклом, вы можете установить true или false другим способом, в зависимости от того, хотите ли вы, чтобы он воспроизводился один или несколько раз.
Если вы хотите получить доступ к потоку позже, вы должны по крайней мере объявить его переменной. Еще лучше написать отдельный класс, который расширяет поток. Таким образом, вы можете добавить метод в поток, который позже сможете вызвать.
Для вашего кода это может выглядеть примерно так:
import java.io.*;
import javazoom.jl.player.*;
public class MyAudioPlayer extends Thread {
private String fileLocation;
private boolean loop;
private Player prehravac;
public MyAudioPlayer(String fileLocation, boolean loop) {
this.fileLocation = fileLocation;
this.loop = loop;
}
public void run() {
try {
do {
FileInputStream buff = new FileInputStream(fileLocation);
prehravac = new Player(buff);
prehravac.play();
} while (loop);
} catch (Exception ioe) {
// TODO error handling
}
}
public void close(){
loop = false;
prehravac.close();
this.interrupt();
}
}
При этом вы можете просто создать поток, когда и где вы хотите, как это:
private MyAudioPlayer thePlayer;
[... some class code here...]
public void yourMethod(){
thePlayer = new MyAudioPlayer("path of the music file", true);
thePlayer.start();
}
и если вы хотите избавиться от него в какой-то момент вызова thePlayer.close();
Обратите внимание, что thePlayer должен быть переменной экземпляра, чтобы вы могли использовать его снова. Если вы объявите его только в методе, он исчезнет после завершения метода.
Надеюсь это поможет.