当然,这里SurfaceView和MediaPlayer使用都正确。
在实际使用中,进入界面时,有时有画面,有时没画面。查了一下代码,一直没有start(),相当于没有准备好。那么我直接start()行不行?还是没画面。
于是加个延时,检查控制器是否已经开始播放。如果已经开始播放返回;没有的话释放之,再重新开始播放动作。问题解决。
代码如下:
private void startPlay()
if (mRtsp == null || !isSurfaceReady) { return; }
//如果已播放直接返回。
if (mPlayer != null && mPlayer.isPlaying()) { return; } if (null != mPlayer) { mPlayer.stop(); mPlayer.release(); mPlayer = null; } try { mPlayer = new MediaPlayer(); mPlayer.setDataSource(NVideoContext.getContext(), Uri.parse(mRtsp)); mPlayer.setSurface(mSurfaceView.getHolder().getSurface()); mPlayer.prepareAsync(); mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mPlayer.start(); } });
//消息处理直接调用startPlay。前面有播放返回代码。
mHandler.sendEmptyMessageDelayed(MESSAGE_PLAY_CHECK, 5000);
} catch (Exception e) { e.printStackTrace(); }