2017-02-20 16 views
0

я просмотр видео и искать бар в моем проекте, вот текущий код, когда искать бар измененAndroid: Ищи видео кадр кадр onSeekbar изменен

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
     } 

     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, 
       boolean fromUser) { 

      if (fromUser) { 
       // this is when actually seekbar has been seeked to a new 
       // position 
       videoView.seekTo(progress); 
      } 
     } 
    }); 

Проблема: когда ничья SeekBar видео seekto не гладкий, он пропускает рамку.

Например:

точки 1 до точки 2:

Продолжительность: 1 секунда

Frames: 3

Если игра видео по videoView.start() это нормально, но если стрелка тяги от точки 1 до пункта 2, она пропускает кадр 2.

ответ

0

При кодировании видеопотока обычно будет что-то, называемое I-кадром (I-Picture) или ключевой кадр, это означает, что этот кадр имеет много информации и может использоваться для полного декодирования кадра. Чтобы уменьшить объем пространства, все кадры не кодируются как ключевые кадры, а они кодируются как P (предсказанные) кадры или предсказанные кадры, что означает, что вы можете декодировать P-кадр с помощью ключевого кадра.

Таким образом, во время операции поиска в этом случае поиск выполняется до ближайшего ключевого кадра для заданной продолжительности времени. Например, если пользователь ищет 40 секунд, а ближайший ключевой кадр находится на 35-й секунде, поиск производится до 35-й секунды, а не до 40-й секунды.

Вы все еще можете попробовать следующее, чтобы узнать, работает ли оно. Расстояние между изображениями I обычно составляет 0,5 секунды. Поэтому вместо поиска в миллисекундах, попробуйте с secs, чтобы перейти непосредственно к картинке I.

@Override 
    public void onProgressChanged(SeekBar seekBar, int progress, 
      boolean fromUser) { 

     if (fromUser) { 
      // this is when actually seekbar has been seeked to a new 
      // position 
      videoView.seekTo(progressx1000); 
     } 
    } 
enter code here 

Попробуйте назвать его в onStopTrackingTouch(), как это:

public void onStopTrackingTouch(SeekBar seekBar) { 
    videoView.seekTo(seekBar.getProgress()); 
} 

Это, как я делаю это в моих проектах.

+0

Извините, это решение не работает в моем случае – Nicky

+0

@Nicky С какой проблемой вы сталкиваетесь, используя это решение? Должно сработать! –

+0

Посмотрите это видео [link] (https://youtu.be/mAnfzJlfmSM) (Case seekTo onProgressChanged). Как вы можете видеть, это отставание при перетаскивании seekBar. И если я поставлю seekTo onStopTrackingTouch, это только seekTo, когда я перестаю перетаскивать. Спасибо – Nicky