指定再生時刻でのイベント発生

Movie PlayList中の指定した再生時刻でイベントを受け取るサンプルコード。

 

Programming HD DVD and Blu-ray Discによると、本APIにはプレーヤー間の非互換性があるとのことなので、そのことを踏まえた上で使用してください。

 

JMF Controlの1つであるorg.davic.media.MediaTimeEventControlを利用したものであり、概要は以下のとおりである。

 

  1. Controlの取得:Movie PlayListを再生するJMF Playerからorg.davic.media.MediaTimeEventControlを取得
  2. Listenerの実装:イベントを受け取るinterfaceであるorg.davic.mediaMediaTimeListenerを実装
  3. Listenerの登録:取得したMediaTimeEventControlに対し、2で実装したlistenerと発生時刻とを指定。なお、発生時刻の指定は、Movie PlayListの先頭を0として、1ナノ秒(1秒の1/(10^9))の精度。
  4. Listenerの登録解除:3で指定した発生時刻に-1をかけた値を指定する(一部のプレーヤーでは動作しない機能。なお、PS3は動作)

 

 

Main.java

 

import javax.media.Control;
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.davic.media.MediaTimeEvent;
import org.davic.media.MediaTimeEventControl;
import org.davic.media.MediaTimeEventListener;
 
public class Main implements Xlet, MediaTimeEventListener {
 
    private MediaTimeEventControl control;
    public void initXlet(XletContext context){
         try {
            BDLocator loc = new BDLocator("bd://1.PLAYLIST:00000");
            MediaLocator ml = new MediaLocator(loc);
            Player player = Manager.createPlayer(ml);
            control = (MediaTimeEventControl)player.getControl("org.davic.media.MediaTimeEventControl");
            control.notifyWhen(this, 1000000000L, 0); // 1秒後
              control.notifyWhen(this, 2000000000L, 1); // 2秒後
              control.notifyWhen(this, 5000000000L, 2); // 5秒後
              control.notifyWhen(this, 10000000000L, 3); // 10秒後
            player.start();
        } catch(Throwable thr) {
        }
    }
    public void startXlet(){	}
    public void pauseXlet(){	}
    public void destroyXlet(boolean unconditional){
        try {
            control.notifyWhen(this, -1000000000L, 0);
            control.notifyWhen(this, -2000000000L, 1); // 2秒後
              control.notifyWhen(this, -5000000000L, 2); // 5秒後
              control.notifyWhen(this, -10000000000L, 3); // 10秒後
        } catch(Throwable thr) {
       }
    }
    // MediaTimeEventListnerを実装するmethod
    public void receiveMediaTimeEvent(MediaTimeEvent e) {
        system.out.println( Integer.toString(e.getEventId())+":"+Long.toString(e.getEventTime()) );
 
    }
}

関連する項目

返信を残す

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