首页 文章

Java MP3播放器 - 使用jLayer播放,暂停和搜索不能正常工作

提问于
浏览
0

我正在尝试在java中实现mp3播放器,它将从字节数组中播放音频 .

该类应该像这样工作:

  • 加载用aes加密的mp3文件

  • 将其解密为bytes / inputstream数组

  • 播放变量中的音乐

  • 让用户暂停/停止/回放它

关键是我使用jLayer的实现不起作用:当我播放 - 暂停 - 恢复时,音频暂停但随后从文件中的随机点恢复 .

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;
    }
}

我该如何解决?

1 回答

  • 0

    您似乎必须在暂停方法上调用stop而不是给它一个位置 .

    public void pausemusic() throws LineUnavailableException {
        player.stop();
    }
    public void stopmusic() throws LineUnavailableException {
        player.stop();
        pausedOnFrame = 0;
    }
    

    我不熟悉你的代码是如何工作的,但如果'stopmusic'方法通过'pausedOnFrame = 0'将歌曲重置为0,你为什么不在播放期间保留一个计数器,这样你就可以创建一个暂停方法知道在哪里找到自己?

    简而言之,为什么不跟踪歌曲的位置?

相关问题