2012-08-10 3 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로 설정된 표면보기를 지우는 방법이 아닙니다.

도와주세요 ~~!

답변

1

당신이 Surface에 직접 그릴 수 lockCanvas 방법이있다. CanvasdrawColor 방법을 사용하여 검정색으로 채 웁니다.

즉, SurfaceView (smile2가 제안한대로)을 제거하는 것이 좋습니다. 이는 Surface을 완전히 파괴하고 사용되지 않는 리소스를 확보해야하기 때문입니다. 재생을 마친 후 MediaPlayerrelease으로 전화를 걸 었는지 확실히 확인하십시오. 너무 많은 동영상 리소스를 보유하면 앱이 다운됩니다.

+0

그것은 최고의 solluction 무엇입니까? jus가 다음 비디오 전에 SurfaceHolder를 지울 방법이없는가요? –

+0

void ClearTextureView() { var cnv = _textureView.LockCanvas(); cnv.DrawColor (Android.Graphics.Color.Transparent, Android.Graphics.PorterDuff.Mode.Clear); _textureView.UnlockCanvasAndPost (cnv); } –

7

이 알아낼 2 주 나를 툭 새로운보기를 추가, 기존 손님의 VideoView를 지켜 보면서을 제거 removeView를 사용 할 수있다. surfaceholder를 TRANSPARENT로 설정하면 Android가 서피스를 파괴합니다. 그런 다음 OPAQUE로 다시 설정하면 서페이스를 "지우는"새 서페이스를 만듭니다. surfacecreate 및 surfacedestroy 이벤트가 발생하므로, 코드가 있으면주의하십시오. 나는 검은 색 바탕에 검정색으로 설정 한 이미지 뷰를 놓았다. 아마도 더 좋은 방법이있을 것입니다. SurfaceHolder

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를 사용하고 Surface를 검은 색으로 채우지 않는 이유는 무엇입니까? – Dave

+1

'surfaceHolder.setFormat (PixelFormat.TRANSPARENT); surfaceHolder.setFormat (PixelFormat.OPAQUE);' 나를 위해 일합니다. 그러나 그것이 정말로하는 것?! –

+1

@MarceloFilho, 당신을 감사합니다 나를 위해 잘 작동 – vuhung3990

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) 작동;

관련 문제