読者です 読者をやめる 読者になる 読者になる

JavaFX Media playerのちょっと面白い機能

JavaFX Media playerのちょっと面白い機能

このエントリは JavaFX Advent Calendar の 12/12 担当分です。
あまり目立たない機能ですが、JavaFXのMedia Playerにはちょっと面白い機能があります。
どんなことかというとMediaのplay(再生)する前に、あらかじめタイマーみたないものを仕掛けておくと、タイマーのタイミングでイベントを起こすことができるのです。
と、まあ、これではよく分からないので、具体例をお見せします。
f:id:taizy:20121210221502p:plain

上はPuaseしていますが、実際にはMediaを再生してから2秒後の状態です。
注目して欲しいのは右上のテキストです。Media再生直後は何も表示されていませんでした。
次に3秒後の状態を見てみます。
f:id:taizy:20121210221814p:plain
右上のテキストの表示が変わっているのが分かります。
これはボタンを押してイベントを起こしたのではなくて、予めタイマー(マーカー)を登録した時刻になったため、イベントが起きているのです。
え、別に珍しくない?
いや、まあ、コードを見てみましょう。

Madia media = new Media(
  "http://download.oracle.com/otndocs/products/javafx/oow2010-2.flv");
mediaView.setMediaPlayer(mediaPlayer);

media.getMarkers().put("Starting race",
                        Duration.millis(1959.183673));
media.getMarkers().put("He is begining \nto get ahead",
                        Duration.millis(3395.918367));
media.getMarkers().put("They are turning \nthe corner",
                        Duration.millis(6060.408163));
media.getMarkers().put("The crowds cheer",
                        Duration.millis(9064.489795));
media.getMarkers().put("He makes the \nfinish line",
                        Duration.millis(11546.122448));

上の3行はMediaとMedia Playerの生成です。
下の9行がマーカーをセットしているところです。マーカーにはStringのキーと、Duration=イベントを発生させる時刻をセットします。
こうやってマーカーをセットしておくことで、所定の時刻にイベントを発生させることができます。
次にテキストをセットしている箇所(ハンドラ)を見てみたいと思います。

mediaPlayer.setOnMarker(new EventHandler (){
  public void handle(MediaMarkerEvent event){
    closedCaption.setText(event.getMarker().getKey());
    System.out.println(event.getMarker().getKey() 
      + " duration: " + event.getMarker().getValue());
  }
}); 

マーカーはMediaにセットしますが、ハンドラはMedia Playerにセットします。
ハンドラの中身は特に変わったことはありません。closedCaptionはTextノードで、そこにマーカー登録時にセットしたキー(String)をセットしています。
これで時間の経過とともにテキスト(メッセージ)が変わっていくように見えます。

以上なのですが、一点重要な注意事項があります。
それは「FLV」でしかマーカーイベントが使えないということです。悲しいですがMP4などでは使えません。。。理由はJavaFX Media Playerの中ではAdobeのPlayerを使っているかららしいです。(詳細が分かったらまで記事を載せます)

最後にマーカーの機能とアニメーションを組み合わせたサンプルを作ってみたのでご紹介しておきます。
Media再生中にペイントとテキストを挿入して、それを再生することができるようになっています。以下URLにソースコードがあるので、ご興味があれば動かして遊んでみてください。

https://github.com/taiz/editable_mediaplayer