当然,这里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();
}