再生時間と再生時刻の取得

Movie PlayListの再生時間(Duration)とMovie PlayList上の現再生時刻を秒精度で取得するサンプルコードである。
もっと精密な時間を取得したい場合は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){
            }
        }
    }
}

関連する項目

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です