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:

  1. Charger le fichier mp3 crypté avec aes
  2. Déchiffrez - le en tableau d'octets / inputstream
  3. Jouer la musique de la variable
  4. 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?

Author: TeoTN, 2014-05-27

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?

 0
Author: Verdant Drift, 2014-05-26 22:34:23