2012-08-10 7 views
12

Hice un reproductor de video con SurfaceView y Mediaplayer. tengo 10 videos y 10 botones. si haces clic en cada botón, se reproducen todos los videos.cómo quitar el soporte de superficie cuando el reproductor multimedia está terminado?

aquí es mi código ..

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

todo está bien. mi videoview personalizado funciona bien. pero cuando el video pasa al siguiente, la última escena del video anterior permanece durante un tiempo y pasa a la siguiente escena de video.

Creo que es porque la vista de superficie anterior debe estar clara antes de reproducir el siguiente video. pero no tengo idea de cómo limpiar la superficie o el soporte de superficie.

he buscado esto pero solo he podido encontrar cómo reproducir el video, no cómo borrar la vista de la superficie, que está configurada como una decepción del reproductor multimedia.

por favor ayúdame ~~!

Respuesta

1

El SurfaceHolder tiene lockCanvas métodos que le permiten dibujar directamente al Surface. Use el método drawColor del Canvas para rellenarlo de negro.

Dicho esto, puede ser preferible eliminar SurfaceView (según lo sugerido por smile2you), porque eso debería destruir el Surface por completo y liberar los recursos no utilizados. Y definitivamente asegúrese de llamar al release en el MediaPlayer s después de que hayan terminado la reproducción. Conservar demasiados recursos de video hará que su aplicación se bloquee.

+0

¿Es la mejor solución? ¿No hay forma de jus borrar el SurfaceHolder antes del próximo video? –

+0

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

1

puede ser que usted puede utilizar RemoveView para eliminar el viejo VideoView custume, a continuación, añadir la nueva vista

7

Me tomó dos semanas para resolver esto. Al establecer el titular de superficie en TRANSPARENTE, Android destruirá la superficie. Luego volver a establecerla en OPAQUE crea una nueva superficie que "limpia" la superficie. Tenga en cuenta que los eventos de superficie y destrucción de superficie se dispararán, por lo que si tiene código allí, tenga cuidado. Puse una vista de la imagen en negro para darle un fondo negro. Quizás hay mejores formas para eso.

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

¿Por qué no usar simplemente lockCanvas en el SurfaceHolder y rellenar la superficie con negro en su lugar? – Dave

+1

'surfaceHolder.setFormat (PixelFormat.TRANSPARENT); surfaceHolder.setFormat (PixelFormat.OPAQUE);' funciona para mi. ¿Pero qué es lo que realmente hace? –

+1

@MarceloFilho gracias chico, trabaja bien para mí – 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(); 
    } 
}); 

que funcione para mí

0

surfaceview.setVisibility (View.GONE);

Cuestiones relacionadas