0

Android アプリには、時間 t1 から別の時間 t2 までビデオを再生する機能が必要です。基本的に、このビデオは私のアプリの一種の「スプライト」です (h264 ベースラインでエンコードされた .mp4 ビデオです)。

ということで、以下をやってみました。ボタン「次へ」は、t1 と t2 の間のビデオを再生します。ビデオが t2 に到着したかどうかを確認するために、20 ミリ秒ごとに postDelayed を呼び出すハンドラーを使用します。動画の現在位置が t2 より大きい場合、動画を停止します。それ以外の場合は、20ms 後に再度チェックします。

しかし、うまくいきません。よくわからないのですが、postDelayed で読み込んでいる動画の現在位置が、ある時から数秒後に急にずれてしまいます。私の画面では、ビデオは正常に再生されます。

いくつかのコード:

// MainActivity
// setting up the video
vidView = (VideoView) findViewById(R.id.myVid);
vidView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/raw/myvid"));    

// wiring up Bt next    
Button nextBt = (Button) findViewById(R.id.next);
nextBt.setOnClickListener(new View.OnClickListener() {

     @Override
     public void onClick(View v) {
          playVideo();
     }
});

そして playVideo メソッド:

private void playVideo() {

    // t1 and t2 are defined within MainActivity class
t1 = (int) (Math.random() * (80000));
t2 = t1 + (int) (Math.random() * (5000));

    // we start at t1
vidView.seekTo(t1);

// We check video position in 20 ms
mHandler.postDelayed(new Runnable() {
     public void run() {

      int currentTime = vidView.getCurrentPosition();

         Log.i("currentTime", String.valueOf(currentTime));
         Log.i("T2", String.valueOf(t2));

      // Ok, we can pause the video
      if(currentTime > t2 - 20) {

          vidView.pause();          

       } 
       // We check again in 20ms
       else {
            mHandler.postDelayed(this, 20);
       }
    }
 }, 20);
 vidView.start();

}

logCat は私に与えます (この例では、T1 = 47286 および T2 = 51478)

10-14 11:31:56.603: I/currentTime(3359): 47286 // first call to postDelayed, fine
10-14 11:31:56.603: I/T2(3359): 51478

10-14 11:31:56.623: I/currentTime(3359): 47286 // second call to postDelayed, still ok
10-14 11:31:56.623: I/T2(3359): 51478

10-14 11:31:56.653: I/currentTime(3359): 50000 // What? How the video current time can already be 3 seconds later?
10-14 11:31:56.653: I/T2(3359): 51478

私のコードの何が問題なのか教えていただけますか? ありがとう!

4

1 に答える 1