質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Java

    14093questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • JavaFX

    402questions

    JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

JavaFXのMediaPlayerクラスのseekメソッドについて

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,378
退会済みユーザー

退会済みユーザー

開発環境

OS : Windows 7 Home Premium
JDK : Ver.1.8.0_51
IDE : NetBeans Ver.8.0.2
DesignTools : Scene Builder 2.0

問題点

現在、JavaFXでミュージックプレイヤーを作成しています

再生時間を任意で変更したいので
MediaPlayerクラスのseekメソッドを使い実装しようとしたのですが
代入した値と再生時間にズレが生じてしまいます

Path → Media → MediaPlayer の順でインスタンス化し
MediaPlayerクラスのplayメソッドで音楽を再生します
path = this.getClass().getResource("sample.mp3").toString();
Media media = new Media(path);
MediaPlayer mediaPlayer = new MediaPlayer(this.media);
mediaPlayer.play();
※ sample.mp3の長さは 227996.734693ms → 約3分48秒 です


MediaPlayerクラスのseekメソッドに5000msを代入する
mediaPlayer.seek(Duration.millis(5000));

本当なら音楽が5秒進んだところから再生されるはずなのですが
音楽は最初(0 ms)から再生されてしまいます

正常にseekメソッドが呼ばれていないのではないかと思い
getCurrentTimeで値を参照してみると5000msが代入されていました
にもかかわらず音楽は最初から再生されてしまいます

どうにか精確に再生時間を変更したいです
どうか皆様のお知恵をおかしください

動作確認

Windows7 64bit : ×
Windows 8.1 with Bing : ×
Ubuntu 14.04 : ○
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

check解決した方法

+2

今回の問題が解決したので記載させていただきます
ズレの原因は音楽ファイルに埋め込まれたジャケット画像でした

ラグが発生していた音楽ファイルのジャケット画像を削除してやるとズレがなくなりました
詳細なテストは行っておりませんが軽いレポートを記載しておおきます
  • ジャケット画像のサイズに比例してズレも大きくなる
  • ジャケット画像のサイズが一定を超えると音楽が再生されなくなる

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

mediaPlayerのstartTimeが5000になっていませんか?もし5000になっているのなら、MediaのstartTimeが5000に設定されているかもしれません。play前にstartTimeを0に設定することで解決しませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/10 13:00

    解答ありがとうございます
    5000.0msに変更する前後でstartImeを確認しましたが
    前後ともに0.0msという値が返ってきてしまいますね

    キャンセル

  • 2015/08/10 13:06

    OpenJFXのコードを見たら、play直後はstartTimeをcurrentTimeに設定しているように見えました。 http://hg.openjdk.java.net/openjfx/8u-dev/rt/file/9b5fc7c1e5e6/modules/media/src/main/java/javafx/scene/media/MediaPlayer.java#l1040

    その周辺を追いかけると、Media#getDuration()辺りで開始時間/終了時間を取得しているようです。

    キャンセル

  • 2015/08/10 14:23

    playの直前にstatTimeやseekを5000msに設定しても
    音楽は最初から再生されてしまいますね・・・

    キャンセル

-1

こちらで試しましたが、特に問題なく再生される様です。
こちらの環境は
Windows 7 64 bit
JDK 8u45
ですが、vhzfsqckさんの環境はどの様なバージョンでしょうか?

動作確認に使ったソースコード


public class App extends Application {

     @Override
    public void start(Stage primaryStage) {
        Group root = new Group();
        Scene scene = new Scene(root, 500, 200);

        Media pick = new Media(this.getClass().getResource("sample.mp3").toString());
        MediaPlayer player = new MediaPlayer(pick);
        MediaView mediaView = new MediaView(player);
        ((Group) scene.getRoot()).getChildren().add(mediaView);

        HBox hbox = new HBox();
        hbox.setAlignment(Pos.CENTER);

        Button seekButton = new Button("Seek");
        seekButton.setOnAction(event -> {
            player.seek(Duration.millis(5000.0));
        });
        hbox.getChildren().add(seekButton);

        Button playButton = new Button("Play");
        playButton.setOnAction(event -> {
             player.play();
        });
        hbox.getChildren().add(playButton);

        Button pauseButton = new Button("Pause");
        pauseButton.setOnAction(event -> {
            player.pause();
        });
        hbox.getChildren().add(pauseButton);

        Button stopButton = new Button("Stop");
        stopButton.setOnAction(event -> {
            player.stop();
        });
        hbox.getChildren().add(stopButton);

        ((Group) scene.getRoot()).getChildren().add(hbox);

        primaryStage.setTitle("Media Player");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/10 23:04

    解答ありがとうございます
    開発環境を記載し忘れていましたね、失礼いたしました
    開発環境につきましては、質問文のほうへ追記させていただきます

    頂いたソースコードをコンパイル、実行したのですが
    やはり、seekメソッドが呼ばれると音楽は最初から再生されてしまいます
    eripongさんの環境下で問題なく動作したということなので
    私の環境、もしくは使用しているmp3ファイルのほうに問題があるのかもしれませんので
    もう少し試行錯誤してみようかと思います

    キャンセル

  • 2015/08/11 09:29 編集

    JDK : Ver.1.8.0_51
    にして実行してみましたが、seekを呼んだ後playすると、
    5秒頃から再生されるようです。

    確認なのですが、そちらでは、5秒後に限らず、
    他の時間を指定しても、音楽が最初から再生されてしまうということでしょうか?

    それから、こちらで確認に使っているmp3ファイルは、
    長さ 5分48秒
    ビットレート 192kbps
    のものです。

    Ubuntu 14.04 : ○
    というのは、これだとうまくいったということでしょうか?

    キャンセル

  • 2015/08/11 09:35

    それから、Stopしているときには、seekは無効になるという仕様のようですが、
    そこは認識合ってますでしょうか?

    https://docs.oracle.com/javafx/2/api/javafx/scene/media/MediaPlayer.html
    「Seeks the player to a new playback time. Invoking this method will have no effect while the player status is MediaPlayer.Status.STOPPED or media duration is Duration.INDEFINITE.」

    キャンセル

  • 2015/08/11 16:10 編集

    >確認なのですが、そちらでは、5秒後に限らず、
    >他の時間を指定しても、音楽が最初から再生されてしまうということでしょうか?
    指定した秒数より5秒遅れて再生されます
    (例)30秒と指定すると25秒から再生される

    このズレは曲によって様々なようです
    | 長さ |ビットレート |ズレ|
    |3分48秒| 320kbps |-5s |
    |3分47秒| 320kbps |-1s |
    |4分59秒| 320kbps |-3s |

    >Ubuntu 14.04 : ○
    >というのは、これだとうまくいったということでしょうか?
    はい、Windowsで動作させた同じプログラムをUbuntuで動作させたところ
    ズレなく、再生時間を変更させることができました
    使用したUbuntuのJDKのバージョンも1.8.0_51です

    >それから、Stopしているときには、seekは無効になるという仕様のようですが、
    >そこは認識合ってますでしょうか?
    はい、大丈夫です

    キャンセル

  • 2015/08/11 18:13

    有用なログが出るか分かりませんが、
    -Djfxmedia.loglevel=debug
    というオプションがある様です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    14093questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • JavaFX

    402questions

    JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。