#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 . Это бесплатно.