Loop video senza interruzioni con VideoView


88

Ho il seguente codice per prendere un video come risorsa raw, avviare il video e riprodurlo in loop, ma ho bisogno che il video venga riprodotto in loop senza interruzioni a partire da ora quando arriva alla fine del clip e riavvia il clip la transizione tra le cause a sfarfallio per una frazione di secondo, cosa che davvero non posso avere per la mia app.

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

La clip dura solo 22 secondi, ma è stata creata per essere senza interruzioni, quindi è possibile lavorare senza ritardi.

Risposte:


230

Prova questo funzionerà al 100%


VideoView videoView;<--- scrivi questo al di fuori del metodo oppure dichiaralo come variabile finale.

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

Ancora rebuffer per ogni loop, non è fluido come il metodo prima di me
Pencilcheck

@Pencilcheck questo è un semplice looping per il video locale, se vuoi usarlo per l'URL e bufferizzarlo, devi implementare un'altra logica.
PravinDodia

Cordiali saluti a tutti, questo non funziona anche per i video locali. Se riproduci un video con un suono costante, puoi sentire la pausa tra i loop.
Edison

1
@PravinDodia Funziona per video mp4 (File) ma non funziona con m3u8. Per favore suggeriscimi una soluzione se hai qualche idea sul file m3u8.
Maroti

2
@PravinDodia Grazie per le informazioni. Sì, ho utilizzato il video in streaming. Ho usato vv.start () in MediaPlayer.OnCompletionListener () invece di loop.
Maroti

7

Non sono sicuro se questo aiuta anni dopo, ma ho usato

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

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

e ha un ciclo continuo


5

La pausa è per il sottostante MediaPlayerper aggiornare i suoi buffer. Quanto tempo ci vorrà dipenderà da una serie di fattori, molti dei quali sono al di fuori del tuo controllo (ad esempio, velocità della CPU, velocità della memoria flash integrata).

Uno che puoi controllare è portare il tuo video fuori dalla risorsa e nel filesystem. Le risorse sono archiviate nell'APK, che è un file ZIP, quindi l'estrazione del video in questo modo richiede probabilmente più tempo.

Potrebbe essere necessario passare da VideoViewe utilizzare un SurfaceViewcon due MediaPlayers, alternando tra loro: uno sta giocando mentre l'altro si sta preparando, quindi quando finisce il gioco puoi passare al nuovo giocatore. Non l'ho provato e quindi non so quali potrebbero essere le ramificazioni. Tuttavia, so che questa tecnica viene spesso utilizzata per la riproduzione audio per passare da una clip all'altra.


Se ricordo bene, i MediaPlayer mantengono surfaceViews quando si preparano, quindi non puoi preparare un altro mediaPlayer mentre uno lo sta usando.
Edison

2

In Kotlin usa semplicemente

videoView.setOnPreparedListener { mp -> mp.isLooping = true }

1

Un po 'tardi, ma c'è qualche motivo per cui non puoi usare quanto segue?

MediaPlayer.setLooping(true);

1
È stato molto tempo fa, ma con questo penso che ci sia stata una pausa evidente nel video quando è stato chiamato il loop around.
SamRowley

1

Se stai 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");
                }
            });

Utilizzo della forma abbreviata di Arrow Expression

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

0

La risposta a questo è rimuovere l'audio dal video e convertirlo in un .oggfile che può essere riprodotto in loop senza interruzioni e quindi utilizzare il video senza audio per eseguire il loop e funziona.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.