2012-08-10 51 views
12

我製作了一個帶有surfaceview和mediaplayer的視頻播放器。 我有10個視頻和10個按鈕。 如果點擊每個按鈕,每個視頻都在播放。媒體播放器完成後如何清除表面支架?

這裏是我的代碼..

//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.. 

一切都很好。 我的自定義視頻工作正常。 但是當視頻轉向下一個時,前一個視頻的最後一個場景會保留一段時間,然後轉向下一個視頻場景。

我認爲這是因爲在下一個視頻播放之前應該清楚上一個表面視圖。 但我不知道如何清除表面視圖或表面持有人。

我已經搜索了這個,但只能找到如何播放視頻,而不是如何清除從mediaplayer設置disaply的SurfaceView。

請幫幫我~~!

回答

1

SurfaceHolder具有lockCanvas方法,將允許你直接繪製到Surface。使用CanvasdrawColor方法填充黑色。

也就是說,可能最好刪除SurfaceView(如smile2you所示),因爲這應該完全銷燬Surface並釋放未使用的資源。在完成回放之後,確保您在MediaPlayer上撥打release。堅持太多的視頻資源會導致你的應用程序崩潰。

+0

這是最好的解決方案嗎?下一個視頻前沒有辦法清除SurfaceHolder嗎? – 2014-03-12 21:16:07

+0

void ClearTextureView() {varillav = _textureView.LockCanvas(); cnv.DrawColor(Android.Graphics.Color.Transparent, Android.Graphics.PorterDuff.Mode.Clear); _textureView.UnlockCanvasAndPost(cnv); } – 2018-02-21 10:52:31

1

可能是你可以使用removeView刪除舊custome videoview,然後添加新的視圖

7

我花了兩個星期的時間摸不着頭腦。通過設置水平邊框爲TRANSPARENT,Android會破壞表面。然後將其設置回OPAQUE創建一個新的表面「清理」表面。注意surfacecreate和surfacedestroy事件會觸發,所以如果您有代碼,請注意。我將imageview設置爲黑色,以將其設置爲黑色背景。這可能有更好的方法。

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() 
} 
+0

爲什麼不直接在SurfaceHolder上使用lockCanvas並用黑色填充表面? – Dave 2013-09-20 01:55:57

+1

'surfaceHolder.setFormat(PixelFormat.TRANSPARENT); surfaceHolder.setFormat(PixelFormat.OPAQUE);'爲我工作。但它真的做了什麼? – 2014-03-12 21:27:28

+1

@MarceloFilho謝謝你,對我很好 – vuhung3990 2014-11-20 04:11:04

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

對我來說

0

surfaceview.setVisibility(View.GONE)工作;