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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaFX

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

Java

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

Q&A

解決済

3回答

3381閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

JavaFX

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

Java

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

0グッド

1クリップ

投稿2015/08/09 16:24

編集2015/08/11 08:14

###開発環境
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メソッドで音楽を再生します

java

1path = this.getClass().getResource("sample.mp3").toString(); 2Media media = new Media(path); 3MediaPlayer mediaPlayer = new MediaPlayer(this.media); 4mediaPlayer.play();

※ sample.mp3の長さは 227996.734693ms → 約3分48秒 です

MediaPlayerクラスのseekメソッドに5000msを代入する

java

1mediaPlayer.seek(Duration.millis(5000));

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

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

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

###動作確認
Windows7 64bit : ×
Windows 8.1 with Bing : ×
Ubuntu 14.04 : ○

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

ラグが発生していた音楽ファイルのジャケット画像を削除してやるとズレがなくなりました
詳細なテストは行っておりませんが軽いレポートを記載しておおきます

  • ジャケット画像のサイズに比例してズレも大きくなる
  • ジャケット画像のサイズが一定を超えると音楽が再生されなくなる

投稿2015/08/11 19:32

編集2015/08/11 19:36
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

lang

1 2public class App extends Application { 3 4 @Override 5 public void start(Stage primaryStage) { 6 Group root = new Group(); 7 Scene scene = new Scene(root, 500, 200); 8 9 Media pick = new Media(this.getClass().getResource("sample.mp3").toString()); 10 MediaPlayer player = new MediaPlayer(pick); 11 MediaView mediaView = new MediaView(player); 12 ((Group) scene.getRoot()).getChildren().add(mediaView); 13 14 HBox hbox = new HBox(); 15 hbox.setAlignment(Pos.CENTER); 16 17 Button seekButton = new Button("Seek"); 18 seekButton.setOnAction(event -> { 19 player.seek(Duration.millis(5000.0)); 20 }); 21 hbox.getChildren().add(seekButton); 22 23 Button playButton = new Button("Play"); 24 playButton.setOnAction(event -> { 25 player.play(); 26 }); 27 hbox.getChildren().add(playButton); 28 29 Button pauseButton = new Button("Pause"); 30 pauseButton.setOnAction(event -> { 31 player.pause(); 32 }); 33 hbox.getChildren().add(pauseButton); 34 35 Button stopButton = new Button("Stop"); 36 stopButton.setOnAction(event -> { 37 player.stop(); 38 }); 39 hbox.getChildren().add(stopButton); 40 41 ((Group) scene.getRoot()).getChildren().add(hbox); 42 43 primaryStage.setTitle("Media Player"); 44 primaryStage.setScene(scene); 45 primaryStage.show(); 46 } 47 public static void main(String[] args) { 48 launch(args); 49 } 50

投稿2015/08/10 12:12

編集2015/08/10 12:31
eripong

総合スコア1546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/08/10 14:04

解答ありがとうございます 開発環境を記載し忘れていましたね、失礼いたしました 開発環境につきましては、質問文のほうへ追記させていただきます 頂いたソースコードをコンパイル、実行したのですが やはり、seekメソッドが呼ばれると音楽は最初から再生されてしまいます eripongさんの環境下で問題なく動作したということなので 私の環境、もしくは使用しているmp3ファイルのほうに問題があるのかもしれませんので もう少し試行錯誤してみようかと思います
eripong

2015/08/11 00:42 編集

JDK : Ver.1.8.0_51 にして実行してみましたが、seekを呼んだ後playすると、 5秒頃から再生されるようです。 確認なのですが、そちらでは、5秒後に限らず、 他の時間を指定しても、音楽が最初から再生されてしまうということでしょうか? それから、こちらで確認に使っているmp3ファイルは、 長さ 5分48秒 ビットレート 192kbps のものです。 Ubuntu 14.04 : ○ というのは、これだとうまくいったということでしょうか?
eripong

2015/08/11 00: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 07:12 編集

>確認なのですが、そちらでは、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は無効になるという仕様のようですが、 >そこは認識合ってますでしょうか? はい、大丈夫です
eripong

2015/08/11 09:13

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

0

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

投稿2015/08/10 01:53

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/08/10 04:00

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

退会済みユーザー

2015/08/10 05:23

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問