Bucle de video sin interrupciones con VideoView

88

Tengo el siguiente código para tomar un video como un recurso sin procesar, iniciar el video y repetirlo, pero necesito que el video se repita sin problemas a partir de ahora cuando llega al final del clip y comienza el clip nuevamente, la transición entre provoca un parpadear durante una fracción de segundo, que realmente no puedo tener para mi aplicación.

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 perfecto, por lo que es posible trabajar sin demoras.

SamRowley
fuente

Respuestas:

230

Prueba esto, funcionará al 100%


VideoView videoView;<--- escribir esto fuera del método o declararlo como variable final.

videoView.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setLooping(true);
    }
});
PravinDodia
fuente
Todavía se vuelve a almacenar en búfer para cada bucle, no es tan suave como el método anterior para mí
Pencilcheck
@Pencilcheck, esto es un bucle simple para video local, si desea usarlo para la URL y almacenarlo en búfer, entonces debe implementar otra lógica.
PravinDodia
Para su información, para todos, esto tampoco funciona para videos locales. Si reproduce un video con sonido constante, puede escuchar la pausa entre bucles.
Edison
1
@PravinDodia Funciona para video mp4 (archivo) pero no funciona con m3u8. Sugierame una solución si tiene alguna idea sobre el archivo m3u8.
Maroti
2
@PravinDodia Gracias por la información. Sí, he usado transmisión de video. He usado vv.start () en MediaPlayer.OnCompletionListener () en lugar de hacer un bucle.
Maroti
7

No estoy seguro de si esto ayuda años después, pero usé

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

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

y tiene un bucle sin interrupciones

lexodus k
fuente
5

La pausa es para que el subyacente MediaPlayeractualice sus búferes. El tiempo que tomará dependerá de una serie de factores, muchos de los cuales están fuera de su control (por ejemplo, velocidad de la CPU, velocidad del almacenamiento flash integrado).

Uno que puede controlar es sacar su video del recurso y colocarlo en el 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 deba cambiar VideoViewy usar un SurfaceViewcon dos MediaPlayers, alternando entre ellos: uno está jugando mientras el siguiente se está preparando, por lo que cuando termine el juego, puede cambiar al nuevo jugador. No lo he probado, por lo que no sé cuáles podrían ser las ramificaciones. Sin embargo, sé que esta técnica se usa con frecuencia para la reproducción de audio para pasar de un clip a otro.

CommonsWare
fuente
Si mal no recuerdo, MediaPlayers se aferra a surfaceViews cuando se prepara, por lo que no puede preparar otro mediaPlayer mientras uno lo está usando.
Edison
2

En Kotlin simplemente use

videoView.setOnPreparedListener { mp -> mp.isLooping = true }
Chirag Kalra
fuente
1

Un poco tarde, pero ¿hay alguna razón por la que no puedas usar lo siguiente?

MediaPlayer.setLooping(true);
JJ
fuente
1
Esto fue hace mucho tiempo, pero con eso creo que hubo una pausa notable en el video cuando se llamó al bucle.
SamRowley
1

Si está usando Kotlin

 videoView.setOnPreparedListener(object : MediaPlayer.OnPreparedListener {
                override fun onPrepared(mp: MediaPlayer?) {
                    //Start Playback
                    videoView.start()
                    //Loop Video
                    mp!!.isLooping = true;
                    Log.i(TAG, "Video Started");
                }
            });

Uso de forma corta de expresión de flecha

videoView.setOnPreparedListener { mp ->
            //Start Playback
            videoView.start()
            //Loop Video
            mp!!.isLooping = true;
            Log.i(TAG, "Video Started");
        };
Hitesh Sahu
fuente
0

La respuesta a esto es eliminar el audio del video y convertirlo en un .oggarchivo que se pueda reproducir sin problemas y luego usar el video sin audio para hacer un bucle y esto funciona.

SamRowley
fuente