Ошибка потоковой передачи Android MediaPlayer: 100: MEDIA_ERROR_SERVER_DIEDAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Ошибка потоковой передачи Android MediaPlayer: 100: MEDIA_ERROR_SERVER_DIED

Сообщение Anonymous »

Я разработал приложение, использующее преимущества встроенного в Android MediaPlayer. Исходный код моего класса, использующего Media Player, приведен ниже.
Проблема в том, что только на некоторых устройствах после нескольких миллисекунд воспроизведения (я слышу только голос, экран остается черным) я продолжаю получать ошибку (100,0), о которой говорится в документации

public static final int MEDIA_ERROR_SERVER_DIED
Медиа-сервер умер. В этом случае приложение должно освободить объект MediaPlayer и создать экземпляр нового.

На форумах я обнаружил, что мне нужно перезагружать плеер каждый раз, когда я его получаю... но я получаю его через короткое время, а затем он умирает навсегда. Я не могу сбрасывать плеер каждую секунду, так как воспроизведение бесполезно. Я не могу понять, почему на некоторых устройствах возникает эта проблема, а на других нет. Тот, который я знаю, имеет ОС Android > 4.0.
Конечно, сначала вызываются init(), а затем showVideo(). Затем вызывается последний onError с кодом 100. Каково потенциальное решение, позволяющее обеспечить непрерывную работу потоков и не прерывать их?
public class NativePlayer extends Player implements OnBufferingUpdateListener,
OnCompletionListener, OnErrorListener, OnInfoListener {

private VideoView videoview;
private PlayerListener listener;
private MainActivity context;

private final Logger logger = LoggerFactory.getLogger(NativePlayer.class);

@Override
public void init(MainActivity activity) {
this.videoview = (VideoView) activity.findViewById(R.id.video);
context = activity;
}

@Override
public void showVideo(final String url, final PlayerListener _listener) {
listener = _listener;
videoview.setVisibility(View.VISIBLE);
try {
Uri video = Uri.parse(url);
videoview.setVideoURI(video);
} catch (Exception e) {
logger.error("Error playing video", e);
listener.onVideoError();
return;
}

videoview.setOnCompletionListener(this);
videoview.setOnErrorListener(this);
videoview.requestFocus();

videoview.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
videoview.start();
if (listener != null) {
listener.onVideoStarted();
}
}
});
}

@Override
public void onStop() {
stop();
}

private void stop() {
if (videoview == null) {
return;
}
if (videoview.isPlaying()) {
videoview.stopPlayback();
}
}

@Override
public void onDestroy() {
}

@Override
public void onCompletion(MediaPlayer mp) {
stop();
}

@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
if (listener != null) {
listener.onVideoError();
}
return false;
}

@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
if (listener != null) {
listener.onInfo(what, extra);
}
return false;
}

@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
if (listener != null) {
listener.onBufferingUpdate(percent);
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/198 ... erver-died
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»