Reputation: 1120
I play a rtsp video stream using MediaPlayer
and display it in a SurfaceView
. I do MediaPlayer initial works in Activity.onResume()
and release it in Activity.onPause()
. It works fine when jump to a normal Activity(called onPause
) then return back(called onResume
).
The problem is, while video is playing, jump to a dialog-like Activity and return back, the video cannot be refreshed(video frame is frozen) but audio was fine. What can I do to play video stream normally in this situation? How to refresh the SurfaceView?
Thank you all.
ps: As description above, normal Activity is an Activity that fill up the whole window, and dialog-like Activity is an Activity that looks like a AlertDialog, usually an Activity with android:theme="@android:style/Theme.Dialog"
theme, just like GoogleVoice app. When this kind of Activity is foreground, we can see part of the background Activity.
EDIT: My code is a little bit complex, and I paste the key snippet:
@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();
}
Upvotes: 3
Views: 7605
Reputation: 1120
Well, I finally solved this problem. I did not re set the SurfaceHolder
of MediaPlayer
(call mMediaPlayer.setDisplay(SurfaceHolder holder)
).
Here is my code:
@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);
}
}
Upvotes: 2