Java MP3 播放器 - 使用 jLayer 播放、暂停和查找无法按预期工作

Posted

技术标签:

【中文标题】Java MP3 播放器 - 使用 jLayer 播放、暂停和查找无法按预期工作【英文标题】:Java MP3 player - play, pause & seek not working as intended with jLayer 【发布时间】:2014-05-26 22:13:27 【问题描述】:

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

这个类应该像这样工作:

    加载用 aes 加密的 mp3 文件 将其解密为字节数组/输入流 从变量播放音乐 让用户暂停/停止/倒带

关键是我使用 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】:

您似乎必须在您的暂停方法上调用停止而不给它一个位置。

    public void pausemusic() throws LineUnavailableException 
    player.stop();

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

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

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

【讨论】:

注意 PlaybackListener 中发生了什么

以上是关于Java MP3 播放器 - 使用 jLayer 播放、暂停和查找无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

MP3 播放器,播放按钮没有声音

如何正确检测、解码和播放无线电流?

如何在java中获取mp3流作为浮点数组

JLayer Player的音量控制

Java 7 中的新 Swing JLayer

为啥缓冲区大小会影响音频数据?