beginners
beginners

Reputation: 283

how to clear surface holder when media player is finished?

I made a video player with surfaceview and mediaplayer. i have 10 videos and 10 buttons. if click on each buttons, each videos are playing.

here is my code..

//onCreate   
holder = surfaceview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


//Button1
if(mp == null)mp = new MediaPlayer();

mp.setDataSource(mediaplay_path);
mp.setDisplay(holder);
mp.setScreenOnWhilePlaying(true);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepare();
mp.start();


//Button2
if(mp != null){
    mp.stop();
    mp.reset();
}

mp.setDataSource(mediaplay_path2);
mp.setDisplay(holder);
mp.setScreenOnWhilePlaying(true);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepare();
mp.start();

//Button3~Button10 is same as Button2..

everything is fine. my custom videoview is working alright. but when the video turns to the next, the last scene of the previous video is remain for a while and turns to the next video scene.

i think it's because the previous surfaceview should be clear before next video is playing. but i have no idea how to clear the surfaceview or surface holder.

i've searched for this but only could find how to play the video, not how to clear the surfaceview which is set the disaply from mediaplayer.

please help me~~!

Upvotes: 18

Views: 14093

Answers (5)

Memphis Wang
Memphis Wang

Reputation: 1

surfaceview.setVisibility(View.GONE);

Upvotes: 0

vuhung3990
vuhung3990

Reputation: 6859

video.getHolder().setFormat(PixelFormat.TRANSPARENT);
video.getHolder().setFormat(PixelFormat.OPAQUE);
video.setVideoURI(Uri.parse(temp));
video.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
      mp.start();
   }
});

it work for me

Upvotes: 5

Dave
Dave

Reputation: 4291

The SurfaceHolder has lockCanvas methods that will allow you to draw directly to the Surface. Use the drawColor method of the Canvas to fill it with black.

That said, it may be preferable to remove the SurfaceView (as suggested by smile2you), because that should destroy the Surface altogether and free up unused resources. And definitely make sure you are calling release on the MediaPlayers after they are done with playback. Holding on to too many video resources will crash your app.

Upvotes: 1

user2743991
user2743991

Reputation: 131

Took me two weeks to figure this out. By setting the surfaceholder to TRANSPARENT, Android will destroy the surface. Then setting it back to OPAQUE creates a new surface "clearing" the surface. Note surfacecreate and surfacedestroy events will fire, so if you have code there, beware. I put a imageview set to black to give it a black background. There maybe better ways for that.

private void playVideoA() { 
     imageViewBlack.bringToFront();
     surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
     surfaceHolder.setFormat(PixelFormat.OPAQUE);
     surfaceView.bringToFront();
     mediaPlayerA.setDisplay(surfaceHolder);
     //surfaceView.setAlpha((float) 0.01);
     mediaPlayerA.start();
};
private void prepareVideoA(String url) {
     try {
        mediaPlayerA = new MediaPlayer();
        mediaPlayerA.setDataSource(url);
        mediaPlayerA.prepareAsync();
        mediaPlayerA.setOnPreparedListener(this);
        mediaPlayerA.setOnCompletionListener(this);
        mediaPlayerA.setOnBufferingUpdateListener(this);
        mediaPlayerA.setOnInfoListener(this);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
};
@Override
public void onPrepared(MediaPlayer mp) {
     playVideoA()
}

Upvotes: 7

smile2you
smile2you

Reputation: 103

may be you can use removeView to remove the old custome videoview ,then add the new view

Upvotes: 1

Related Questions