更快的onScroll手势反馈

时间:2017-07-26 20:53:32

标签: android video-processing interactive onscroll mediametadataretriever

我有一个视频文件,并希望让用户通过向右和向左滑动手势来回播放。用户体验应该是平滑的,如果视频文件包含从左到右的静态场景,则用户应该具有在图片上左右滚动的印象(来自更新的部分)。这是我目前的代码。

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提供大约两到三次调用,因此上述代码的结果只是用户看到的两到三帧,而不是所有流畅的视频体验。

对于像onScroll这样的手势,有没有办法获得更多/更快的反馈?我也对解决问题的其他建议持开放态度。

1 个答案:

答案 0 :(得分:0)

我使用OnTouchListener ImageView解决了问题。

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,因为它会减慢实时搜索速度,但这是另一个问题。