1

プログラムでmp3ファイルを再生するためにjlayerを使用していますが、jlayerのドキュメントでは、音楽の再生を停止し、停止した場所から続行するための有用な情報を見つけることができませんでした。何か案は?

私のプログラムは次のとおりです。


package sounds;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import javazoom.jl.player.Player;

/**
 * Wayne, K. (2005). How to Play an MP3 File in Java. 
 * Available: http://introcs.cs.princeton.edu/faq/mp3/mp3.html.
 * Last accessed 10th Mar 2011.
 * @author temelm
 */
public class MP3 {
  private String filename;
  private Player player;

  /**
   * MP3 constructor
   * @param filename name of input file
   */
  public MP3(String filename) {
    this.filename = filename;
  }

  /**
   * Creates a new Player
   */
  public void play() {
    try {
      FileInputStream fis = new FileInputStream(this.filename);
      BufferedInputStream bis = new BufferedInputStream(fis);

      this.player = new Player(bis);
    } catch (Exception e) {
        System.err.printf("%s\n", e.getMessage());
    }

    new Thread() {
      @Override
      public void run() {
        try {
          player.play();
        } catch (Exception e) {
            System.err.printf("%s\n", e.getMessage());
        }
      }
    }.start();
  }

  /**
   * Closes the Player
   */
  public void close() {
    if (this.player != null) {
      this.player.close();
    }
  }

  /////////////////////////

  /**
   * Plays '01 Maenam.mp3' in an infinite loop
   */
  public static void playMaenam() {
    MP3 mp3 = new MP3("./01 Maenam.mp3");

    mp3.play();

    while (true) {
      if (mp3.player.isComplete()) {
        mp3.close();
        mp3.play();
      }
    }
  }
}

4

3 に答える 3

2

単純な一時停止機能のためにスレッドを一時停止することができます。

于 2012-06-26T14:54:08.487 に答える
2

スレッドで一度に1フレームずつ再生します。「一時停止」フラグが設定されている場合は、スレッドを一時停止します...

以下のコードは、Enterキーが押された場合(コンソールで)、プレーヤースレッドを一時停止/再開し、アプリケーションを終了するために「終了」します。

            final AtomicBoolean pause = new AtomicBoolean(false);

        final Player player = new Player(bis);
        Thread playerThread = new Thread() {
            @Override
            public void run() {
                try {
                    while (player.play(1)) {
                        if(pause.get()) {
                            LockSupport.park();
                        }
                    }
                }
                catch (Exception e) {
                    System.err.printf("%s\n", e.getMessage());
                }
            }
        };

        playerThread.start();

        Scanner scanner = new Scanner(System.in);
        String s = null;
        while (!(s = scanner.nextLine()).equals("exit")) {
            if (s.isEmpty()) {
                pause.set(!pause.get());
                if (!pause.get()) {
                    LockSupport.unpark(playerThread);
                }
            }
        }
        System.exit(0);
于 2013-05-24T15:24:36.903 に答える
0

fileInputStreamからmp3を取得します。一時停止したいときは、(fisはfileinputstreamです)fis.available()(または同様のもの)を実行します。これにより、ストリームに残っているバイト数がわかります...開始する前にこれを行うと、全長が得られます。したがって、残りの合計-現在残っている量=現在の位置。次に、新しい入力ストリームを作成して、fis.skip(theamount);を実行します。再開する..素晴らしい方法ですが、ええ、それは機能します..

于 2011-04-24T23:16:54.507 に答える