0

私はビデオファイルを持っており、ユーザーにスワイプの左右のジェスチャーで前後に再生させたいと考えています。ビデオファイルに左から右の静的なシーンが含まれている場合、ユーザはピクチャ上で左右にスクロールするような印象を持たなければなりません。これは私が現在持っているコードです。onScrollのジェスチャーのフィードバックをより速く

private GestureDetectorCompat mDetector; 
private long lengthTourMs; 
private long currentPositionMs; 
private FFmpegMediaMetadataRetriever mmr; 
ImageView video; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    video = (ImageView)findViewById(R.id.video_frame); 

    mDetector = new GestureDetectorCompat(this, new SwipeGestureListener()); 

    mmr = new FFmpegMediaMetadataRetriever(); 
    mmr.setDataSource(this, Uri.parse("path/to/video/file")); 
    lengthTourMs = Long.parseLong(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION)); 
    currentPositionMs = 2000; 
    Bitmap frame = mmr.getFrameAtTime(currentPositionMs * 1000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST); 
    video.setImageBitmap(frame); 
} 


class SwipeGestureListener extends GestureDetector.SimpleOnGestureListener { 
    private static final String TAG = "Gestures"; 

    @Override 
    public boolean onScroll(MotionEvent event1, MotionEvent event2, 
     float distanceX, float distanceY) { 
    Log.d(TAG, "onScroll: " + String.valueOf(distanceX)); 

    currentPositionMs += (long)distanceX; 
    currentPositionMs += lengthTourMs; 
    currentPositionMs %= lengthTourMs; 
    Bitmap frame = mmr.getFrameAtTime(currentPositionMs * 1000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST); 
    Log.d(TAG, "currentPositionMs: " + String.valueOf(currentPositionMs)); 
     video.setImageBitmap(frame); 
    return true; 
    } 
} 

問題が正常スワイプ左/右ジェスチャがonScrollに2~3の呼び出しの周り与え、上記のコードの結果は、ユーザがすべての滑らかな映像を見ていないことがちょうど2〜3フレームであることですのような経験。

onScrollのようなジェスチャーのフィードバックをより多く/より速くする方法はありますか?私はまた、問題を解決するための他の提案にもオープンしています。

答えて

0

ImageViewOnTouchListenerで問題を解決しました。

private int x,y; 
private long lengthTourMs; 
private long currentPositionMs; 
private FFmpegMediaMetadataRetriever mmr; 
ImageView video = (ImageView)findViewById(R.id.video_frame); 

video.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
    int xx,changeX; 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
     x = (int) event.getX(); 
     break; 
     case MotionEvent.ACTION_MOVE: 
     xx = (int) event.getX(); 
     changeX = x - xx; 
     currentPositionMs += changeX; 
     currentPositionMs += lengthTourMs; 
     currentPositionMs %= lengthTourMs; 
     video.setImageBitmap(mmr.getFrameAtTime(currentPositionMs * 1000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST)); 
     x = xx; 
     break; 
     default: 
     break; 
    } 
    return true; 
    } 
}); 

それがリアルタイムシークのために遅くすることであるように私は実際には、もはやFFmpegeMediaMetadataRetrieverを使用していないのですが、それは別の問題です。

関連する問題