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
私のコードの何が問題なのか教えていただけますか? ありがとう!