Android: ошибка поиска видео

#android #video #seek

#Android #Видео #искать

Вопрос:

У меня есть приложение с видеопроигрывателем. Я реализовал метод, который сохраняет текущую позицию в видео, чтобы при следующем воспроизведении пользователем того же видео оно воспроизводилось с того места, где пользователь его оставил. Однако я не могу загрузить видео с позиции, с которой оно осталось. Кошка журнала постоянно показывает эту ошибку

 10-23 21:23:23.699: ERROR/TI_Video_Decoder(1250): Unknown event: 1
10-23 21:23:23.699: ERROR/TI_Video_Decoder(1250): Corrupted Data in buffer 0x2b59c8 0(int# 0/0)
10-23 21:23:23.699: ERROR/TI_Video_Decoder(1250): Unknown event: 1
10-23 21:23:23.699: ERROR/TI_Video_Decoder(1250): Corrupted Data in buffer 0x4a2ad0 0(int# 0/0)
10-23 21:23:23.699: ERROR/TI_Video_Decoder(1250): Unknown event: 1
10-23 21:23:23.699: ERROR/TI_Video_Decoder(1250): Corrupted Data in buffer 0x2b5a20 0(int# 0/0)
10-23 21:23:23.699: ERROR/TI_Video_Decoder(1250): Unknown event: 1
10-23 21:23:23.699: ERROR/TI_Video_Decoder(1250): Unknown event: 1
10-23 21:23:23.699: ERROR/TI_Video_Decoder(1250): Corrupted Data in buffer 0x1c09a0 0(int# 0/0)
10-23 21:23:23.699: ERROR/TI_Video_Decoder(1250): Unknown event: 1
10-23 21:23:23.699: ERROR/TI_Video_Decoder(1250): Unknown event: 1
10-23 21:23:23.699: ERROR/TI_Video_Decoder(1250): Corrupted Data in buffer 0x3dafa0 0(int# 0/0)
10-23 21:23:23.707: ERROR/TI_Video_Decoder(1250): Unknown event: 1
10-23 21:23:23.707: ERROR/TI_Video_Decoder(1250): Unknown event: 1
10-23 21:23:23.707: ERROR/TI_Video_Decoder(1250): Unknown event: 1
10-23 21:23:23.707: ERROR/TI_Video_Decoder(1250): Corrupted Data in buffer 0x2b59c8 0(int# 0/0)
10-23 21:23:23.707: ERROR/TI_Video_Decoder(1250): Corrupted Data in buffer 0x1c4028 0(int# 0/0)
10-23 21:23:23.707: ERROR/TI_Video_Decoder(1250): Corrupted Data in buffer 0x2b5a20 0(int# 0/0)
10-23 21:23:23.707: ERROR/TI_Video_Decoder(1250): Corrupted Data in buffer 0x4a2ad0 0(int# 0/0)
  

Это мой код для воспроизведения видео. Может кто-нибудь подсказать мне, почему я получаю эту ошибку. Спасибо.. Вот код

Проигрыватель общедоступного класса расширяет активность {

 private static Context mContext;
private int mStartTime = 0;
private int sliderPosition; 
private int setTime;
private String uriString; 
private MediaPlayer player;

private class ErrorListener implements OnErrorListener {

private class CompletionListener implements OnCompletionListener {
    // FIXME: @Override
    public void onCompletion(MediaPlayer mp) {
        mContext = null;
        mStartTime = 0;
        System.exit(-1);
    }
}

private static Context getContext() {
    return mContext;
}

private static void setContext(Context context) {
    mContext = context;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    System.gc();
super.onCreate(savedInstanceState);
    setContext(this);
    Intent intent = getIntent();
    Uri uri = intent.getData();
    uriString = intent.getStringExtra("filename" );
    if (uri != null) {  
        setContentView(R.layout.videoview);
        VideoView videoView = (VideoView) findViewById(R.id.videoview);
        videoView.setVideoURI(uri);
        videoView.setMediaController(new MediaController(this));
        videoView.setOnErrorListener(new ErrorListener());
        videoView.setOnCompletionListener(new CompletionListener());
        videoView.setKeepScreenOn(true);
        videoView.requestFocus();
    }
}//onCreate Method Ends

public void onStart(){
    super.onStart();
    VideoView videoView = (VideoView) findViewById(R.id.videoview);
    SharedPreferences Settings = getSharedPreferences("MyStoragePreferences", MODE_PRIVATE);
  if(Settings.contains(uriString))
    {
        setTime= Settings.getInt(uriString, 0);
        videoView.seekTo(setTime);
    videoView.start();
    }
    else
    {
        videoView.seekTo(mStartTime);
        videoView.seekTo(0);
        if (mStartTime == 0){
        videoView.start();
        }
    }
}

public void onSaveInstanceState(Bundle outState){
    VideoView videoView = (VideoView) findViewById(R.id.videoview);
    mStartTime = videoView.getCurrentPosition();
    outState.putInt("restartTime", mStartTime);
    super.onSaveInstanceState(outState);
}

@Override
protected void onDestroy() {
    mContext = null;
    super.onDestroy();
}

@Override
protected void onStop(){
    super.onStop();
    VideoView videoView = (VideoView) findViewById(R.id.videoview);
    videoView.stopPlayback();

}

@Override
protected void onPause(){
    super.onPause();
    VideoView videoView = (VideoView) findViewById(R.id.videoview);
    sliderPosition= videoView.getCurrentPosition();
    SharedPreferences Settings = getSharedPreferences("MyStoragePreferences", MODE_PRIVATE);
    SharedPreferences.Editor prefEditor = Settings.edit();
    prefEditor.putInt(uriString, sliderPosition);
    prefEditor.commit();
}
  

}

Ответ №1:

Из документации:

Хотя асинхронный seekTo(int) вызов возвращает правильный путь, фактическая операция поиска может занять некоторое время, особенно для потокового аудио / видео. Когда фактическая операция поиска завершается, внутренний движок проигрывателя вызывает пользователя, указанного OnSeekComplete.onSeekComplete() , если OnSeekCompleteListener он был зарегистрирован заранее через setOnSeekCompleteListener(OnSeekCompleteListener) .

Причина, по которой вы, вероятно, получаете эту ошибку, заключается в том, что медиаплеер выполняет поиск медленно, поэтому к моменту начала воспроизведения видео поиск еще не завершен. Следовательно, он считывает поврежденные буферы

Комментарии:

1. на самом деле, сэр, я ждал несколько минут, но это не сработало, и в то же время logcat постоянно генерировал ошибки, которые я показал в своем вопросе..

2. Вы не должны ждать, вы должны использовать OnSeekCompleteListener для выполнения ожидания. Вызов videoView.start() в OnSeekCompleteListener

3. Сэр, спасибо за ваш ответ. Не могли бы вы прокомментировать, почему я получаю ошибку «поврежденные данные в буфере»?? большое спасибо

4. Один последний совет, сэр. Должен ли я использовать VideoView или использовать mediaplayer? Пожалуйста, продолжайте проверять комментарии на этой странице. Ваша помощь может решить мою проблему. Большое спасибо

5. Не называйте меня «сэр», я не был посвящен в рыцари. пока. Чтобы ответить на ваш вопрос, я предлагаю вам использовать медиа-фреймворк vitamio , они реализовали просмотр видео с помощью OnSeekCompleteListener . Это бесплатно.