2014年2月19日 星期三

JavaFX Media (3) Marker

標記 (Marker) 是針對媒體額外附加文字說明,類似於字幕,雖然音訊與影像均可以加入標記,但由於音訊並無影像,因此在實作上僅針對影像處理。

欲處理標記,可使用Media類別的getMarkers()方法,getMarkers()方法回傳ObservableMap介面物件,其內容由字串與時間所組成,代表在特定「時間」處理指定的「標記字串」。其內容可由ObservableMap介面的put()方法依序加入。待標記處理完成之後,再以MediaPlayer類別的setOnMarker()方法處理。

請參考以下範例,示範在影像中附加標記字串。首先以Media類別的getMarkers()方法回傳ObservableMap介面物件,並以put()方法依序加入標記字串與時間:


final ObservableMap<String, Duration> markers = media.getMarkers();
markers.put("Marker 1", Duration.millis(3000));
markers.put("Marker 2", Duration.millis(6000));
markers.put("Marker 3", Duration.millis(9000));
markers.put("Marker 4", Duration.millis(12000));
markers.put("Marker 5", Duration.millis(15000));


接著以MediaPlayer類別的setOnMarker()方法處理標記字串:


final Label lblMarker = new Label();
lblMarker.setFont(Font.font("Verdana", 12));
lblMarker.setTextFill(Color.WHITE);
StackPane.setAlignment(lblMarker, Pos.CENTER);

mediaplayer.setOnMarker(new EventHandler<MediaMarkerEvent>() {
  @Override public void handle(final MediaMarkerEvent e) {
    Platform.runLater(new Runnable() {
      @Override public void run() {
        
        lblMarker.setText(e.getMarker().getKey());
      }
    });
  }
});
...

StackPane stackpane = new StackPane();
stackpane.getChildren().addAll(borderpane, lblMarker);
// Set the Layout Pane of Scene
Scene scene = new Scene(stackpane);   


【執行結果】
【參考資料】

[1] 黃嘉輝,深入研究JavaFX 2。
[2] 黃嘉輝,深入研究Java Swing。
[3] Java Official Web Site:http://www.oracle.com/technetwork/java/index.html
[4] JavaFX:http://www.oracle.com/technetwork/java/javafx
[5] JavaFX 2.2 API Specification.
[6] Java Platform, Standard Edition 7 API Specification.

© Chia-Hui Huang

沒有留言:

張貼留言