2011-01-20 19 views
60

Tengo el siguiente código para tomar un video como recurso sin formato, iniciar el video y reproducirlo en bucle pero necesito que el video se repita sin interrupciones a partir de ahora cuando se trata de un final del clip y comienza De nuevo, el clip hace que la transición entre ellas provoque un parpadeo durante una fracción de segundo, lo cual realmente no puedo tener para mi aplicación.Video continuo Bucle con VideoView

public class Example extends Activity { 
    VideoView vv; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     vv = (VideoView)findViewById(R.id.VideoView01); 

     //Video Loop 
     vv.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      public void onCompletion(MediaPlayer mp) { 
       vv.start(); //need to make transition seamless. 
      } 
     }); 

     Uri uri = Uri.parse("android.resource://com.example/" 
       + R.raw.video); 

     vv.setVideoURI(uri); 
     vv.requestFocus();  
     vv.start(); 
    } 
} 

El clip tiene solo 22 segundos de duración, pero fue creado para ser sin costura, por lo que es posible trabajar sin demoras.

Respuesta

149

Prueba esto va a funcionar al 100%


videoView.setOnPreparedListener(new OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
     mp.setLooping(true); 
    } 
}); 
+0

Todavía rebuffer para cada ciclo, no es tan fácil como el método anterior para mí – Pencilcheck

+0

@Pencilcheck esto es simple bucle para video local, si desea usarlo para url y almacenarlo en búfer, entonces tiene que implementar otra lógica. – PravinDodia

+0

FYI para todos, esto no funciona para videos locales también. Si reproduce un video con sonido constante, puede escuchar la pausa entre los bucles. – Edison

4

La pausa es para el subyacente MediaPlayer para actualizar sus búferes. El tiempo que eso tome dependerá de una serie de factores, muchos de los cuales están fuera de su control (por ejemplo, la velocidad de la CPU, la velocidad de almacenamiento flash a bordo).

Uno que puede controlar es sacar su video del recurso y dentro del sistema de archivos. Los recursos se almacenan en el APK, que es un archivo ZIP, por lo que extraer el video de esta manera probablemente lleve más tiempo.

Es posible que tenga que cambiar lejos de VideoView y utilizar un SurfaceView con dos MediaPlayers, alternando entre ellos - uno está jugando mientras que la siguiente es la preparación, por lo que cuando la reproducción se termina se puede cambiar al nuevo jugador. No lo he intentado, así que no sé cuáles podrían ser las ramificaciones. Sin embargo, sé que esta técnica se utiliza con frecuencia para la reproducción de audio para la transición de un clip a otro.

+0

Si no recuerdo mal, MediaPlayers se aferran a surfaceViews al conseguir preparado, por lo que no se puede preparar otro MediaPlayer mientras lo está utilizando. – Edison

0

Responda a esto es eliminar el audio del video y convertirlo a un archivo .ogg que se puede enlazar sin problemas y luego utilizar el video sin audio para dar vueltas y esto funciona.

1

Poco tarde, pero alguna razón por la que no puede usar lo siguiente?

MediaPlayer.setLooping(true); 
+1

Esto fue hace mucho tiempo, pero con eso creo que hubo una pausa notable en el video cuando se llamó. – SamRowley

1

No estoy seguro si este ayuda años después, pero utilicé

vv.start(); 
vv.setOnCompletionListener (new MediaPlayer.OnCompletionListener() { 

@Override 
    public void onCompletion(MediaPlayer mediaPlayer) { 
    vv.start(); 
    } 
}); 

y tiene un bucle sin fisuras

Cuestiones relacionadas