安卓MediaPlayer流媒体错误:100:MEDIA_ERROR_SERVER_DIED

6
我开发了一个应用程序,利用了本机Android的MediaPlayer。以下是使用媒体播放器的我的类的源代码。
问题在于,在某些设备上播放几毫秒后(我只听到声音,屏幕仍然黑色),我一直收到错误(100,0),根据文档的说法
“public static final int MEDIA_ERROR_SERVER_DIED” 媒体服务器已死。 在这种情况下,应用程序必须释放MediaPlayer对象并实例化新对象。
在论坛上,我发现每次获取它时都需要重置播放器...但是我很快就得到了它,然后它永远死亡。 每秒重置播放器是无用的。 我不明白为什么有些设备会出现这个问题,而其他设备则不会。 我知道其中一个设备具有Android OS> 4.0。
当然,首先调用init(),然后调用showVideo()。最后会调用错误代码为100的onError。如何使流连续运行而不中断?可能的解决方案是什么?
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);
        }
    }
}
1个回答

0

我曾经遇到过同样的问题(错误代码100,媒体播放器死亡等)。 我通过使用.stopPlayback()方法解决了这个问题,并重新开始流式传输。 以下是我的部分代码:

private void startWatchVideo(final string video_link) {
        videoViewVA.setMediaController(new MediaController(this));
        videoViewVA.setVideoURI(Uri.parse(video_link));
        videoViewVA.requestFocus();
        videoViewVA.setOnPreparedListener(new OnPreparedListener() {
            public void onPrepared(MediaPlayer media) {
                media.start();
            }
        });

        videoViewVA.setOnErrorListener(new OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer media, int what, int extra) {
                if (what == 100)
                {
                    videoViewVA.stopPlayback();
                    startWatchVideo(video_link);
                }
                return true;
            }
        });
    }

实际上,从实践来看,视频似乎只是变慢了。


感谢您的反馈 :) 很抱歉,我手头的华为设备显示错误100,无论如何都不能播放HLS,只有切换到其他播放器才能解决问题 :( - basta
如果解决方案不起作用,重新启动视频又会导致 100 次的重复,那么你就会陷入开始和停止视频的循环中。 - Micky
@Kim 我增加了重试次数,我尝试了两次,如果再次失败,我会显示错误消息。 - Poovizhirajan N
@basta 什么替代播放器?你能详细说明一下吗? - Dmila Ram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接