Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo limpiar el soporte de superficie cuando el reproductor de medios está terminado?

Hice un reproductor de video con superficie y mediaplayer. Tengo 10 videos y 10 botones. Si hace clic en cada uno de los botones, cada uno de ellos se reproduce.

Aquí está mi código

  • Error de inclusión no resuelto al utilizar NDK
  • Cargar imagen de Android en React Native
  • Cómo iniciar servicio en nuevo hilo en android
  • Mover las aplicaciones a la tarjeta SD
  • Excepción generada durante la representación: No se puede localizar el modo 0
  • Cómo restablecer AnimationDrawable
  • //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 esta bien. Mi vídeo personalizado está funcionando bien. Pero cuando el video pasa a la 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 previa de la superficie debe estar clara antes de que el siguiente video esté en reproducción. Pero no tengo ni idea de cómo despejar la superficie o soporte de superficie.

    He buscado esto, pero sólo podría encontrar cómo reproducir el vídeo, no cómo borrar la vista de superficie que se establece el disaply de mediaplayer.

    Por favor, ayúdame ~~!

  • Cómo abrir un proyecto en eclipse
  • ¿Cómo se pasan las imágenes (mapas de bits) entre las actividades de androide mediante bundles?
  • CollapsingToolbarLayout a veces deja espacio en blanco debajo
  • Android heterogénea gridview como pinterest?
  • Android: ¿Cómo agregar el oyente al botón del menú del hardware?
  • Session 'app': Error Actividad de inicio
  • 5 Solutions collect form web for “Cómo limpiar el soporte de superficie cuando el reproductor de medios está terminado?”

    SurfaceHolder tiene métodos lockCanvas que le permitirán dibujar directamente a la Surface . Utilice el método drawColor del Canvas para llenarlo con negro.

    Dicho esto, puede ser preferible quitar el SurfaceView (como lo sugirió smile2you), porque eso debería destruir la Surface completamente y liberar los recursos no utilizados. Y definitivamente asegúrese de que está llamando a la release en el MediaPlayer s después de que hayan terminado con la reproducción. Si te quedas con demasiados recursos de video, se detendrá tu aplicación.

    Me tomó dos semanas entender esto. Al configurar el soporte de superficie en TRANSPARENT, Android destruirá la superficie. A continuación, volver a configurar OPAQUE crea una nueva superficie que "limpia" la superficie. Tenga en cuenta que los eventos de surfacecreate y surfacedestroy se dispararán, por lo que si tiene código allí, tenga cuidado. Puse una visión de la imagen fijada al negro para darle un fondo negro. Hay quizá mejores maneras 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() } 

    Puede ser que usted puede utilizar removeView para quitar el viejo videovision del custome, después agrega la nueva visión

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

    Funciona para mi

    Surfaceview.setVisibility (View.GONE);

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.