2012-08-10 10 views
12

Zrobiłem odtwarzacz wideo z widokiem powierzchni i mediaplayer. Mam 10 filmów i 10 przycisków. jeśli klikniesz na każdym przycisku, odtwarzane będą wszystkie filmy.Jak wyczyścić uchwyt powierzchniowy po zakończeniu odtwarzania multimediów?

tutaj jest mój kod ..

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

wszystko jest w porządku. Mój niestandardowy widok wideo działa poprawnie. , ale gdy wideo przejdzie do następnego, ostatnia scena poprzedniego wideo pozostaje na chwilę i przechodzi do następnej sceny wideo.

Myślę, że to dlatego, że poprzedni widok powierzchni powinien być wyraźny przed rozpoczęciem następnego wideo. , ale nie mam pojęcia, jak wyczyścić uchwyt powierzchni lub powierzchni.

Szukałem tego, ale mogłem tylko znaleźć sposób odtwarzania wideo, a nie jak wyczyścić widok powierzchni, który jest ustawiony z dyskiem z mediaplayer.

proszę mi pomóc ~~!

Odpowiedz

1

SurfaceHolder ma lockCanvas metod, które pozwolą Ci czerpać bezpośrednio do Surface. Użyj metody drawColor, aby wypełnić ją kolorem czarnym.

To powiedziawszy, może być lepiej usunąć SurfaceView (zgodnie z sugestią użytkownika smile2you), ponieważ powinno to całkowicie zniszczyć Surface i uwolnić niewykorzystane zasoby. I na pewno upewnij się, że dzwonisz pod numer release po skończeniu odtwarzania. Trzymanie zbyt dużej ilości zasobów wideo spowoduje awarię aplikacji.

+0

To najlepsze solluction? Czy nie ma sposobu, aby wyczyścić SurfaceHolder przed następnym wideo? –

+0

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

1

może można użyć removeView usunąć starą custome videoview, a następnie dodać nowy widok

7

zajęło mi dwa tygodnie, aby dowiedzieć się tego. Ustawiając Nośnik powierzchni na TRANSPARENT, Android zniszczy powierzchnię. Następnie ustawienie z powrotem na OPAQUE tworzy nową powierzchnię "czyszczącą" powierzchnię. Zwróć uwagę na zdarzenia związane z surfowaniem i eksplozją, więc jeśli masz tam kod, strzeż się. Ustawiłem widok obrazu na czarny, aby nadać mu czarne tło. Mogą być na to lepsze sposoby.

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

Dlaczego po prostu nie używać LockCanvas na SurfaceHolder i zamiast niego wypełnić powierzchnię czarnym? – Dave

+1

'surfaceHolder.setFormat (PixelFormat.TRANSPARENT); surfaceHolder.setFormat (PixelFormat.OPAQUE);' pracuje dla mnie. Ale co tak naprawdę robi ?! –

+1

@MarceloFilho dziękuję, dobrze dla mnie pracuj – 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(); 
    } 
}); 

to działa na mnie

0

surfaceview.setVisibility (View.GONE);

Powiązane problemy