我注意到,有很多主题是有关使用暂停/恢复MP3的JLayer,因此为了帮助所有人,我专门为此设计了整个课堂!请参阅下面的答案。
JLayer
注意:这是供我个人使用的,因此它可能不如某些人希望的那样健壮。但是由于其简单性,进行简单的修改并不难。
播放器的一个非常简单的实现,实际上是暂停播放。它通过使用单独的线程播放流并告诉播放器线程是否/何时暂停和继续工作来工作。
public class PausablePlayer { private final static int NOTSTARTED = 0; private final static int PLAYING = 1; private final static int PAUSED = 2; private final static int FINISHED = 3; // the player actually doing all the work private final Player player; // locking object used to communicate with player thread private final Object playerLock = new Object(); // status variable what player thread is doing/supposed to do private int playerStatus = NOTSTARTED; public PausablePlayer(final InputStream inputStream) throws JavaLayerException { this.player = new Player(inputStream); } public PausablePlayer(final InputStream inputStream, final AudioDevice audioDevice) throws JavaLayerException { this.player = new Player(inputStream, audioDevice); } /** * Starts playback (resumes if paused) */ public void play() throws JavaLayerException { synchronized (playerLock) { switch (playerStatus) { case NOTSTARTED: final Runnable r = new Runnable() { public void run() { playInternal(); } }; final Thread t = new Thread(r); t.setDaemon(true); t.setPriority(Thread.MAX_PRIORITY); playerStatus = PLAYING; t.start(); break; case PAUSED: resume(); break; default: break; } } } /** * Pauses playback. Returns true if new state is PAUSED. */ public boolean pause() { synchronized (playerLock) { if (playerStatus == PLAYING) { playerStatus = PAUSED; } return playerStatus == PAUSED; } } /** * Resumes playback. Returns true if the new state is PLAYING. */ public boolean resume() { synchronized (playerLock) { if (playerStatus == PAUSED) { playerStatus = PLAYING; playerLock.notifyAll(); } return playerStatus == PLAYING; } } /** * Stops playback. If not playing, does nothing */ public void stop() { synchronized (playerLock) { playerStatus = FINISHED; playerLock.notifyAll(); } } private void playInternal() { while (playerStatus != FINISHED) { try { if (!player.play(1)) { break; } } catch (final JavaLayerException e) { break; } // check if paused or terminated synchronized (playerLock) { while (playerStatus == PAUSED) { try { playerLock.wait(); } catch (final InterruptedException e) { // terminate player break; } } } } close(); } /** * Closes the player, regardless of current state. */ public void close() { synchronized (playerLock) { playerStatus = FINISHED; } try { player.close(); } catch (final Exception e) { // ignore, we are terminating anyway } } // demo how to use public static void main(String[] argv) { try { FileInputStream input = new FileInputStream("myfile.mp3"); PausablePlayer player = new PausablePlayer(input); // start playing player.play(); // after 5 secs, pause Thread.sleep(5000); player.pause(); // after 5 secs, resume Thread.sleep(5000); player.resume(); } catch (final Exception e) { throw new RuntimeException(e); } } }