Java MP3 player-lecture, pause et recherche ne fonctionne pas comme prévu avec jLayer
J'essaie d'implémenter un lecteur mp3 en java qui lira l'audio à partir d'un tableau d'octets.
La classe devrait fonctionner comme ceci:
- Charger le fichier mp3 crypté avec aes
- Déchiffrez - le en tableau d'octets / inputstream
- Jouer la musique de la variable
- Laissez l'utilisateur mettre en pause/arrêter / rembobiner
Le fait est que mon implémentation à l'aide de jLayer ne fonctionne pas: lorsque je fais play - pause - resume, l'audio est en pause mais reprend ensuite à partir d'un point aléatoire fichier.
public class MPlayer{
AdvancedPlayer player;
private static int pausedOnFrame =0;
private byte[] decrypted = null;
private long audioLength;
private AudioInputStream stream;
private InputStream bytesToStream(byte[] in) {
InputStream is = new ByteArrayInputStream(in);
return is;
}
public MPlayer(String fname) {
/* here file is encrypted to variable byte[] decrypted and then: */
InputStream is = bytesToStream(decrypted);
stream = AudioSystem.getAudioInputStream(is);
audioLength = stream.getFrameLength();
player = new AdvancedPlayer(stream);
player.setPlayBackListener(new PlaybackListener() {
@Override
public void playbackFinished(PlaybackEvent event) {
System.err.println(event.getFrame());
pausedOnFrame = event.getFrame();
}
}
}
public void play() throws Exception {
Thread th = new Thread() {
public void run() {
player.play(MPlayer.pausedOnFrame, Integer.MAX_VALUE);
}
};
th.start();
}
public void fastforward() {
pausemusic();
long nextFrame = (long) (pausedOnFrame+0.02*audioLength);
if (nextFrame < audioLength)
play();
}
public void rewind() {
pausemusic();
long nextFrame = (long) (pausedOnFrame-0.02*audioLength);
if (nextFrame > 0)
play();
}
}
public void pausemusic() throws LineUnavailableException {
player.stop();
}
public void stopmusic() throws LineUnavailableException {
player.stop();
pausedOnFrame = 0;
}
}
Comment puis-je résoudre ce problème?
1 answers
Vous semblez devoir appeler stop sur votre méthode pause et ne pas lui donner d'emplacement.
public void pausemusic() throws LineUnavailableException {
player.stop();
}
public void stopmusic() throws LineUnavailableException {
player.stop();
pausedOnFrame = 0;
}
Je ne connais pas le fonctionnement de votre code, mais si la méthode 'stopmusic' réinitialise la chanson à 0 via le 'pausedOnFrame = 0', pourquoi ne gardez-vous pas un compteur pendant la lecture afin de pouvoir créer une méthode de pause qui sait où se localiser?
En bref, pourquoi ne suivez-vous pas où se trouve la chanson?