2011-01-25 22 views
0

私はVideoViewを使用してAndroidを使用して動画プレーヤーを構築しています。 私はビデオプレーヤーを稼働させることができましたが、現在はクロノメーターを使用してカウンタを設定していますが、ファイルを選択するとティッキングが開始されます。
しかし、クリップが開始されたときにタイマーが数秒間にカウントを開始している間に、ビデオクリップの実行に数秒かかります。Android Sync with timer

カウンタをメディアファイルと同期する方法を教えてください。
私はチェックしましたが、答えが見つからないようです。

video = (VideoView) findViewById(R.id.video); 
    play = (Button) findViewById(R.id.play); 
    pause = (Button) findViewById(R.id.pause); 
    stop = (Button) findViewById(R.id.stop); 
    reset = (Button) findViewById(R.id.reset); 
    Chronometer counter = (Chronometer) findViewById(R.id.chrono); 
    startTime = SystemClock.elapsedRealtime(); 
    time = (TextView) findViewById(R.id.time); 

     try { 
     video.setVideoPath(link); 
     video.start(); 
     video.requestFocus(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } 

    play.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      video.start(); 
      video.requestFocus(); 
     } 
    }); 
    pause.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      video.pause(); 
     } 
    }); 
    stop.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      try { 
       video.stopPlayback(); 
       video.setVideoPath(link); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
    reset.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      try { 
       video.seekTo(0); 
       video.start(); 
       video.requestFocus(); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

counter.setOnChronometerTickListener(new OnChronometerTickListener(){ 
     public void onChronometerTick(Chronometer arg0) { 
      countUp = (SystemClock.elapsedRealtime() - arg0.getBase())/1000; 
      duration = video.getDuration(); 
      if (countUp % 60 <= 9) { 
       countText = (countUp/60) + ":0" + (countUp % 60); 
      } else { 
       countText = (countUp/60) + ":" + (countUp % 60);   
      } 
      if (duration % 60000 <= 9) { 
       durationText = (duration/60000) + ":0" + (duration % 60000); 
      } else { 
       durationText = (duration/60000) + ":" + (duration % 60000);   
      } 
      time.setText(countText + "/" + durationText); 
     } 
    }); 
    counter.start(); 

答えて

0

心配はありませんが、私はクロノメーターでVideoView getCurrentPosition()を使用する方法を発見しました。 これで、常に現在の時刻が正しく表示され、チェックを続けるのが簡単になりました。

counter.setOnChronometerTickListener(new OnChronometerTickListener(){ 
     public void onChronometerTick(Chronometer arg0) { 
      countUp = video.getCurrentPosition(); 
      countUp = Math.round(countUp/1000); 
      duration = video.getDuration(); 
      duration = duration/1000; 
      long a = (long) countUp; 
      if (countUp % 60000 <= 9) { 
       countText = (a/60000) + ":0" + (a % 60000); 
      } else { 
       countText = (a/60000) + ":" + (a % 60000);   
      } 
      if (duration % 60000 <= 9) { 
       durationText = (duration/60000) + ":0" + (duration % 60000); 
      } else { 
       durationText = (duration/60000) + ":" + (duration % 60000);   
      } 
      time.setText(countText + "/" + durationText); 
     } 
    }); 
    counter.start(); 
0

他の人に役立つかもしれないので、私はこの2セントを与えます。

MediaPlayerを取得できるonPreparedListenerをセットアップできます。 MediaPlayerには、メディアがバッファリングされているか、実際にレンダリングされている最初のフレームさえも知らせるonInfoListenerがあります。MEDIA_INFO_VIDEO_RENDERING_START(API 17+のみ)。 オーバーライドされたVideoViewクラスのローカル状態変数(例:enum VideoPlayerState(BUFFERING、PLAYING、STOPPED、OPEN、PAUSED))を更新するために使用しています。 状態が変化しているときにコールバックを取得するためにセッターをオーバーライドすることができます。 そのコールバックでタイマーを開始/一時停止できます。

setOnPreparedListener(new OnPreparedListener() { 
     @Override 
     public void onPrepared(final MediaPlayer mp) { 
      mp.setOnInfoListener(new OnInfoListener() { 

       @Override 
       public boolean onInfo(MediaPlayer mp, int what, int extra) { 
        if (what == MediaPlayer.MEDIA_INFO_BUFFERING_START) { 
         setPlayerState(VideoPlayerState.BUFFERING); 
        } else if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END) { 
         if (mp.isPlaying() 
           && mPlayerState == VideoPlayerState.BUFFERING) { 
          setPlayerState(VideoPlayerState.PLAYING); 
         } 
        } 
        return false; 
       } 
      }); 
}); 

また、状態を切り替えるVideoViewにこれらのメソッドをオーバーライドすることができます。

@Override 
public void pause() { 
    super.pause(); 
    setPlayerState(VideoPlayerState.PAUSED); 
} 

@Override 
public void start() { 
    super.start(); 
    setPlayerState(VideoPlayerState.PLAYING); 
} 

@Override 
public void stopPlayback() { 
    super.stopPlayback(); 
    setPlayerState(VideoPlayerState.STOPPED); 
} 

はそれがお役に立てば幸いです。