Ниже приведен код для воспроизведения удаленной видео моей:
Uri uri = Uri.parse(URLPath);
vv.setVideoURI(uri);
vv.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//play next one
}
});
vv.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
return false;
}
});
Он работает для большинства моих устройств.
Но это не работает на некоторых устройствах (таких как Samsung Galaxy S2).
Я получаю код Error (200,-82)
.
Я нашел, что это MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK
. Что это значит?
И как этого избежать?
MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK, поскольку doc говорит:
Видео транслируется, и его контейнер недействителен для прогрессивного воспроизведения, т.е. Индекс видео (например, атом moov) не находится в начале файла.
MediaPlayer часто меняет состояние ошибки при воспроизведении видео, а затем запрашивает диалоговое окно "Невозможно воспроизвести это видео", поэтому вам придется обрабатывать эту ошибку, запоминая воспроизводимое время и воспроизводя видео после сброса движка MediaPlayer.
Вы можете реализовать OnErrorListener
в своем коде для обработки таких ошибок:
private MediaPlayer.OnErrorListener mOnErrorListener = new MediaPlayer.OnErrorListener() {
public boolean onError(MediaPlayer mp, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
Toast.makeText(PlayerActivity.this, "MEDIA_ERROR_SERVER_DIED",
Toast.LENGTH_SHORT).show();
return true;
case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
Toast.makeText(PlayerActivity.this,
"MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK",
Toast.LENGTH_SHORT).show();
break;
case MediaPlayer.MEDIA_ERROR_UNKNOWN:
Toast.makeText(PlayerActivity.this, "MEDIA_ERROR_UNKNOWN",
Toast.LENGTH_SHORT).show();
break;
}
setProgressContainer(true, getString(R.string.msg_handle_error));
int position=mVideoView.getCurrentPosition();
if(position>0){
mCurPosition=position;
}
mVideoView.setVideoPath(mCurrentMediaUrl,position);
return true;
}
};