8

MediaPlayer(Android ICS)を使用して複数のビデオをループ再生し、oncompletion()が呼び出されるたびにビデオを変更しようとしています。

それはうまく機能しますが、ランダムな時間の後にアプリケーションがフリーズし、エラーが発生します:

[SurfaceView]接続:すでに接続されています(cur = 3、req = 3)setVideoSurfaceTextureが失敗しました:-22

このエラーが発生すると、内部的にリセットプレーヤーが呼び出されます

ref:mediaplayer.cpp

if (err != OK) {
    LOGE("setVideoSurfaceTexture failed: %d", err);
    // Note that we must do the reset before disconnecting from the ANW.
    // Otherwise queue/dequeue calls could be made on the disconnected
    // ANW, which may result in errors.
    reset();
    disconnectNativeWindow();
    return err;
}

私のコードに従って、onprepared()の通知を受け取り、再生を開始します。

実際には、このエラーのために再生はありません。

したがって、この問題が発生し、メディアプレーヤーが再生されていないときに、メディアプレーヤーをリセットしてprepare()を呼び出そうとしますが、このバグをキャプチャできません(mp.isPlaying()-> true(bec'zはonpreparedでstart()と呼ばれます) ())。

私は次のようなロジックを試します

onprepared() {
    mp.start();
    if (pbm : [SurfaceView] connect : already connected (cur=3, req=3)
                                      setVideoSurfaceTexture failed : -22  ) {
        reset the mediaplayer source and call prepare
    }
}

このバグを見つけてメディアプレーヤーを再起動するにはどうすればよいですか?

4

1 に答える 1

10

この問題は次の方法で回避できます...

   mediaPlayer.setDisplay(null);

   mediaPlayer.reset();

この後、メディアプレーヤーを起動する前にサーフェスホルダーを再度設定します

    mediaPlayer.setDisplay(surfaceHolder1);

    mediaPlayer.start();  in onprepared notification.
于 2012-08-28T12:16:17.223 に答える