Blog -
VideoViewでランダムで取得した動画を再生する機能を作成中に
MediaPlayer error(1,-2147483648)が発生する、再生自体に問題無い様だが、気持ちが悪い
調べても、殆どが英文で、拙く訳してもGoogleに聞けとかコメントの無い物も多かった。
その中でもいくつかヒントを得て試行錯誤した結果、回避したので記事にします。
どうも発生する原因は、動画読み込み中に再生を始めたとか動画再生中にほかの動画を読み込んだとか
そう言った感じのエラーと解釈した。
まず最初のコード(簡略化)
private static VideoView mVideoView; //中略 //ランダムでリソースIDをゲット-rawから取得 int movRId = getMovie(); mVideoView.setVideoURI(Uri.parse( "android.resource://" + mContext.getApplicationContext().getPackageName() + "/" + movRId )); mVideoView.start();
ボタンクリックにて毎回ランダムにIDを取得して再生させる。
これでエラーが発生するも、再生自体には問題無いただ、ボタンの連打が怖いので加工する。
onCompletionは再生終了後にコールバックされるので開始と合わせてフラグを設定する。
private static VideoView mVideoView; private static boolean mov_mode = false; mVideoView.setOnCompletionListener(new OnCompletionListener () { public void onCompletion(MediaPlayer mp) { mov_mode = false; //動画終了 } }); //中略 //ランダムでリソースIDをゲット-rawから取得 if(!mov_mode){ mov_mode = true; int movRId = getMovie(); mVideoView.setVideoURI(Uri.parse( "android.resource://" + mContext.getApplicationContext().getPackageName() + "/" + movRId )); mVideoView.start(); }
連打の抑止は出来たもののエラーはまだ発生している。
次に、リソース読み込み前に再生されている可能性への対応をする。
onPreparedは、読み込み完了時にコールバックされる。
mVideoView.setOnPreparedListener(videoViewPrepared); private OnPreparedListener videoViewPrepared = new OnPreparedListener() { public void onPrepared(MediaPlayer mp) { mVideoView.start(); } }; //中略 //ランダムでリソースIDをゲット-rawから取得 if(!mov_mode){ mov_mode = true; int movRId = getMovie(); mVideoView.setVideoURI(Uri.parse( "android.resource://" + mContext.getApplicationContext().getPackageName() + "/" + movRId )); //mVideoView.start(); onPreparedで再生するのでコメント }
これで、setVideoURI時にonPreparedがコールバックされて再生される事になる。
しかし、まだエラーが発生している。読み込み遅延でのエラーでは無いらしい。
次に、再生中に次の読み込みを始めている可能性を考えるが onCompletionが発生しているので
再生中という事は無いだろうと判断する デバッグを何度か見直すとどうやら初回は発生しない、
という事は2回目の読み込みの 前か同時に発生している事になる。
手始めに、リソースを初期化する事にした。
mVideoView.setOnCompletionListener(new OnCompletionListener () { public void onCompletion(MediaPlayer mp) { mov_mode = false; mVideoView.setVideoURI(null); //動画終了 } });
と、発生しなくなった。
VideoURIに再生出来るリソースが読み込まれているのに読み込むと出る様だ。
いちいち空にしろということなのかストリームから取り込めという事なのか、とにかく回避した。