【问题标题】:How to refresh SurfaceView when Activity onResume?Activity onResume 时如何刷新 SurfaceView?
【发布时间】:2013-02-26 16:57:22
【问题描述】:

我使用 MediaPlayer 播放 rtsp 视频流并将其显示在 SurfaceView 中。我在Activity.onResume() 中进行 MediaPlayer 初始工作,并在Activity.onPause() 中发布它。当跳转到正常 Activity(称为onPause)然后返回(称为onResume)时,它工作正常。

问题是,在播放视频时,跳转到类似对话框的 Activity 并返回,视频无法刷新(视频帧被冻结)但音频正常。在这种情况下,我该怎么做才能正常播放视频流?如何刷新 SurfaceView?

谢谢大家。

ps:如前所述,普通Activity是填满整个窗口的Activity,dialog-like Activity是看起来像AlertDialog的Activity,通常android:theme="@android:style/Theme.Dialog" 主题的 Activity,就像 GoogleVoice 应用程序一样。这种Activity在前台时,我们可以看到后台Activity的一部分。

EDIT:我的代码有点复杂,我粘贴了键sn-p:

@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();
}

【问题讨论】:

  • 没有刷新你的表面视图的东西,可能是你的代码做错了,bdw表面会在onPause时被破坏,最好你发布代码!!
  • @DavidArfin 我已经粘贴了我的代码的 sn-p,感谢您的关注。我想指出的是,它在正常活动中运行良好。
  • 我猜在这种情况下不会调用 onPause 并且您的视频活动正在失去焦点一旦对话框活动弹出更好您可以动态地执行它(我的意思是释放并重新启动它)您知道当您将开始对话活动以及何时完成。
  • @DavidArfin 我已经使用 logcat 跟踪了这个,onPause 被调用,就像普通的 Activity 推送前台一样。
  • 好的,我会建议你不要从 onResume 方法启动媒体播放器。您可以轻松跟踪对话活动的开始和结束,一旦对话活动完成(onActivityResult),您就可以继续..

标签: android media-player surfaceview


【解决方案1】:

好吧,我终于解决了这个问题。我没有重新设置MediaPlayerSurfaceHolder(调用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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多