5

ネイティブ Android の MediaPlayer を利用するアプリを開発しました。Media Player を使用するクラスのソース コードは次のとおりです。

問題は、数ミリ秒の再生後に一部のデバイスでのみ発生することです(音声のみが聞こえ、画面は黒いままです)ドキュメントerror(100,0)によると、

public static final int MEDIA_ERROR_SERVER_DIED

メディア サーバーが停止しました。この場合、アプリケーションは MediaPlayer オブジェクトを解放し、新しいオブジェクトをインスタンス化する必要があります。

フォーラムで、プレーヤーを取得するたびにリセットする必要があることがわかりました...しかし、ほんの少しの時間で取得し、その後永遠に死んでしまいます。再生が役に立たないため、プレーヤーを毎秒リセットすることはできません。一部のデバイスでこの問題が発生し、他のデバイスでは発生しない理由がわかりません。私が知っているのは Android OS > 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);
        }
    }
}
4

1 に答える 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;
            }
        });
    }

実際には、ビデオの速度が低下しているように見えます

于 2014-04-28T13:31:09.913 に答える