MediaPlayer与SurcaceView出现Media Server Died现象

在正常情况的显示信息(在ipad机型上)

12-03 13:49:33.484: E/VideoSizeListener(13194): Send MEDIA_SET_VIDEO_SIZE message.
12-03 13:49:33.484: E/VideoSizeListener(13194): width:640, height : 480
12-03 13:49:33.488: I/Get RATIO(13194): dw: 800, dh: 480
12-03 13:49:33.488: I/VIDEO_INFO(13194): mVideoWidth: 640, mVideoHeight: 480
12-03 13:49:33.488: I/RATIO(13194): dw: 640, dh: 480
12-03 13:49:33.496: E/mediaplayer(13194): surfaceChanged
12-03 13:49:33.496: E/mediaplayer(13194): width: 640, height: 480
12-03 13:49:33.519: D/AudioHardware(13121): AudioHardware pcm playback is exiting standby.
12-03 13:49:33.519: D/AudioHardware(13121): openPcmOut_l() mPcmOpenCnt: 0
12-03 13:49:33.597: E/(13121): SsbSipMfcDecExe: IOCTL_MFC_DEC_EXE failed(ret : -2005)
12-03 13:49:33.613: E/AwesomePlayer(13121): component name =OMX.SEC.AVC.Decoder
12-03 13:49:33.613: E/AwesomePlayer(13121): render width=640
12-03 13:49:33.613: E/AwesomePlayer(13121): render height=480
12-03 13:49:33.613: E/AwesomePlayer(13121): render decodedWidth=640
12-03 13:49:33.613: E/AwesomePlayer(13121): render decodedHeight=480
12-03 13:49:33.613: D/SEC_Overlay(200): overlay_createOverlay:IN w=640 h=480 format=272
12-03 13:49:33.613: D/SEC_Overlay(200): src width, height are changed [w= 640, h= 480]->[w=640, h= 480]
12-03 13:49:33.613: D/v4l2_utils(200): v4l2_overlay_init:: w=640 h=480
12-03 13:49:33.621: I/SEC_Overlay(200): Opened video1/fd=186/obj=00437e50/shm=185/size=4096
12-03 13:49:33.621: D/SEC_Overlay(200): dst width, height have changed [w= 640, h= 480] -> [w=640, h= 480]
12-03 13:49:33.621: I/SEC_Overlay(200): Postponing Stream Enable/1/0
12-03 13:49:33.621: E/SecHardwareRenderer(13121): mColorFormat == OMX_COLOR_FormatVendorStartUnused+1
12-03 13:49:33.621: E/AwesomePlayer(13121): retmote render=2130706433

在htc手机上

12-03 13:57:39.253: E/VideoSizeListener(446): Send MEDIA_SET_VIDEO_SIZE message.
12-03 13:57:39.253: E/VideoSizeListener(446): width:640, height : 480
12-03 13:57:39.253: D/MediaPlayer(446): start() in
12-03 13:57:39.253: D/MediaPlayer(446): [DLNA]Streaming path, should force enable DLNA if in mirror mode or have usage dongle
12-03 13:57:39.263: D/MediaPlayer(446): [DLNA]not in Mirror mode, check nearby ready dongle
12-03 13:57:39.263: D/MediaPlayer(446): [DLNA]startMirror in
12-03 13:57:39.263: D/MediaPlayer(446): [getReadyDongle] No ready to use dongle
12-03 13:57:39.263: D/MediaPlayer(446): [DLNA][startMirror] out no ready to use dongle
12-03 13:57:39.263: D/MediaPlayer(446): [DLNA]start() streaming do local playback
12-03 13:57:39.263: D/MediaPlayer(446): doStart() in
12-03 13:57:39.263: D/MediaPlayer(446): beats setting trigger in start
12-03 13:57:39.263: D/MediaPlayer(446): beats setting  true
12-03 13:57:39.263: D/MediaPlayer(446): triggerBeatsLogo=true
12-03 13:57:39.273: D/MediaPlayer(446): doStart() out
12-03 13:57:39.273: D/MediaPlayer(446): [DLNA]start() streaming out
12-03 13:57:39.273: I/Get RATIO(446): dw: 800, dh: 480
12-03 13:57:39.273: I/VIDEO_INFO(446): mVideoWidth: 640, mVideoHeight: 480
12-03 13:57:39.273: I/RATIO(446): dw: 640, dh: 480
12-03 13:57:39.293: E/mediaplayer(446): surfaceChanged
12-03 13:57:39.293: E/mediaplayer(446): width: 640, height: 480
12-03 13:57:39.293: D/MediaPlayer(446): [DLNA]setDisplay

在MediaPlayer与SurcaceView播放视频的时候,如果播放的视频码流有误,使Media Server Died, 这时如果重新释放MediaPlayer并创建,有时会出现 [SurfaceView] connect: already connected (cur=3, req=3) setVideoSurfaceTexture failed: -22这样的错误(这是在htc上出现的)或者出现 E/MemoryHeapBase(13312): mmap(fd=21, size=0) failed (Invalid argument)(这是在ipad上出现的)

分析原因应该是surfaceview占用,与新创建的mediaplayer无法正常关联,需要重新创建surfaceview

可行方法

surfaceView.setVisibility(View.GONE);

surfaceView.setVisibility(View.VISIBLE);

这样就可以重新创建surfaceview,可以恢复上面提示的错误,正常播放。

参考代码

private void Replay() {

mediaPlayer.reset();
  mediaPlayer.release();
  mediaPlayer = null;
  surfaceView.setVisibility(View.GONE);
  mediaPlayer = new MediaPlayer();
  mediaPlayer.setOnErrorListener(mErrorListener);
  mediaPlayer.setOnPreparedListener(new PrepareListener(0));
  mediaPlayer.setOnVideoSizeChangedListener(new VideoSizeListener());
  mediaPlayer.setOnCompletionListener(mOnCompletionListener);
  surfaceView.setVisibility(View.VISIBLE);

    try {
    if (mediaPlayer != null) {
     mediaPlayer.reset();
     handlerUI.sendEmptyMessageDelayed(HIDESURFACE, 100);
     mediaPlayer.setDataSource(strUrl);
     mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
     mediaPlayer.setDisplay(surfaceHolder);
     mediaPlayer.prepareAsync();// 缓冲
    }
   } catch (Exception e) {
    e.printStackTrace();
   }

}

转载于:https://my.oschina.net/u/175078/blog/94243

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值