2013-03-11 251 views
3

我使用MediaPlayer播放rtsp视频流并将其显示在SurfaceView中。我在MediaPlayer的初始作品Activity.onResume()中发布并在Activity.onPause()中发布。它正常工作时跳转到正常活动(称为)然后返回(称为onResume)。如何在Activity onResume时刷新SurfaceView?

问题是,当视频播放时,跳到对话框样活动并返回,视频无法刷新(视频帧被冻结),但音频很好。在这种情况下,我能做些什么来正常播放视频流?如何刷新SurfaceView?

谢谢大家。

PS:如以上描述,正常活动是填满整个窗口的活动,并般的对话活动是看起来像一个AlertDialog,通常android:theme="@android:style/Theme.Dialog"主题的活动的活动,就像GoogleVoice的应用程序。当这种Activity是前景时,我们可以看到背景Activity的一部分。

编辑:我的代码是有点复杂,我贴的关键片段:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    //.... 
    mPreview = (SurfaceView) this.findViewById(R.id.playerView); 
    mHolder = mPreview.getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

@Override 
protected void onResume() { 
    mPath = "rtsp://10.10.20.42/Viral.mp4"; 
    // Create a new media player and set the listeners 
    mMediaPlayer = new MediaPlayer(); 
    mMediaPlayer.setDataSource(mPath); 
    // mMediaPlayer.setDisplay(holder); 
    mMediaPlayer.setScreenOnWhilePlaying(true); 
    mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    mMediaPlayer.prepareAsync(); 
    mMediaPlayer.setOnBufferingUpdateListener(this); 
    mMediaPlayer.setOnCompletionListener(this); 
    mMediaPlayer.setOnPreparedListener(this); 
    mMediaPlayer.setOnVideoSizeChangedListener(this); 
    mMediaPlayer.setOnErrorListener(this); 

    super.onResume(); 
} 

@Override 
protected void onPause() { 
    if (mMediaPlayer != null) { 

     mMediaPlayer.release(); 
     mMediaPlayer = null; 
    } 
    super.onPause(); 
} 
+0

有刷新你的表面看法没有这样的事,可能是你正在做一些事情错了你的代码,BDW表面将在在onPause被破坏,更好您发布代码! – 2013-03-11 13:37:53

+0

@DavidArfin我已经粘贴了我的代码片断,感谢您的关注。我想指出的是,它在**正常活动**中工作正常。 – iStar 2013-03-12 02:44:22

+0

我猜onPause不会在这种情况下被调用,并且您的视频活动失去焦点一旦对话框活动弹出更好,您可以动态地执行它(我的意思是释放并重新启动它),因为您知道什么时候要启动Dialog活动和当你完成它。 – 2013-03-12 03:39:25

回答

2

好了,我终于解决了这个问题。我没有重新设置SurfaceHolderMediaPlayer(致电mMediaPlayer.setDisplay(SurfaceHolder holder))。

这里是我的代码:

@Override 
protected void onResume() { 
    mPath = "rtsp://10.10.20.42/Viral.mp4"; 
    // Create a new media player and set the listeners 
    mMediaPlayer = new MediaPlayer(); 
    mMediaPlayer.setDataSource(mPath); 
    // mMediaPlayer.setDisplay(holder); 
    mMediaPlayer.setScreenOnWhilePlaying(true); 
    mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    mMediaPlayer.prepareAsync(); 
    mMediaPlayer.setOnBufferingUpdateListener(this); 
    mMediaPlayer.setOnCompletionListener(this); 
    mMediaPlayer.setOnPreparedListener(this); 
    mMediaPlayer.setOnVideoSizeChangedListener(this); 
    mMediaPlayer.setOnErrorListener(this); 

    if (mHolder != null) { 
     mMediaPlayer.setDisplay(mHolder); 
    } 
    super.onResume(); 
} 

@Override 
public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) { 
    Log.d(TAG, "surfaceChanged called"); 
    this.mHolder = surfaceholder; 
    if (mMediaPlayer != null) { 
     mMediaPlayer.setDisplay(surfaceholder); 
    } 
} 
相关问题