0

我需要一个 android 应用程序能够播放从时间 t1 到另一个时间 t2 的视频。基本上,这个视频是我应用程序中的一种“精灵”(它是一个 .mp4 视频 h264 基线编码)。

所以,我尝试了以下方法。按钮“下一步”在 t1 和 t2 之间播放视频。为了检查视频是否已经到达 t2,我使用了一个处理程序,每 20 毫秒调用一次 postDelayed。如果视频当前位置大于 t2,我停止视频。否则,我会在 20 毫秒内再次检查。

但它不起作用。由于我不明白的原因,我在 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

0

而不是不断检查为什么不设置一个处理程序以在以后的特定时间停止它?您无需检查它是否已“到达” T2 - 您知道何时要停止它,因此只需安排在那时停止它。

Runnable stopVideoTask = new Runnable(){
    @Override
    public void run() {
        vidView.pause();
    }
};

int t2 = (int) (Math.random() * 5000);
vidView.seekTo(t1);
vidView.start();
mHandler.postDelayed(stopVideoTask, t2);

视频将在Math.random() * 5000播放几秒钟后停止。

于 2013-10-14T10:28:36.013 回答