Movie PlayListの再生時間(Duration)とMovie PlayList上の現再生時刻を秒精度で取得するサンプルコードである。
もっと精密な時間を取得したい場合はgeSeconds()の代わりにgetNanoSeconds()を使用すれば、ナノ秒単位の時間が取得可能。
もっと精密な時間を取得したい場合はgeSeconds()の代わりにgetNanoSeconds()を使用すれば、ナノ秒単位の時間が取得可能。
コードとjavax.media.PlayerのAPI仕様を見てわかるように、DurationUpdateEventが発生するまでは、getDuration()で取得される値は保証されないので注意が必要。
Main.java
import java.awt.Color;
import java.awt.Graphics;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.DurationUpdateEvent;
import javax.media.Manager;
import javax.media.Player;
import javax.tv.xlet.Xlet;
import javax.tv.xlet.XletContext;
import org.bluray.net.BDLocator;
import org.davic.media.MediaLocator;
import org.havi.ui.HScene;
import org.havi.ui.HSceneFactory;
import org.havi.ui.HScreen;
public class Main implements Xlet, ControllerListener, Runnable {
Graphics g;
Player player;
int x = 100, y = 50;
public void initXlet(XletContext context){
try {
HScene hs= HSceneFactory.getInstance().getFullScreenScene(
HScreen.getDefaultHScreen().getDefaultHGraphicsDevice());
g = hs.getGraphics();
g.setColor(Color.white);
BDLocator loc = new BDLocator("bd://1.PLAYLIST:00000");
MediaLocator ml = new MediaLocator(loc);
player = Manager.createPlayer(ml);
// Duration取得可能イベントを取得するためのリスナー設定
player.addControllerListener(this);
player.start();
hs.setVisible(true);
// 再生時刻取得スレッドを起動
new Thread(this).start();
} catch (Throwable thr){
}
}
public void startXlet(){ }
public void pauseXlet(){ }
public void destroyXlet(boolean unconditional){}
public void controllerUpdate(ControllerEvent event) {
// Durationが取得できるのを待つ
if( event instanceof DurationUpdateEvent ){
// Durationを取得
int duration = (int)player.getDuration().getSeconds();
g.drawString("duration="+Integer.toString(duration), x, y); y+=50;
}
}
public void run() {
for( ;; ){
// 再生時刻を取得
int position = (int)player.getMediaTime().getSeconds();
g.drawString("position="+Integer.toString(position), x, y); y+=50;
try {
Thread.sleep(1000);
} catch (Throwable thr){
}
}
}
}