Boucle vidéo transparente avec VideoView

88

J'ai le code suivant pour prendre une vidéo en tant que ressource brute, démarrer la vidéo et la mettre en boucle, mais j'ai besoin que la vidéo boucle de manière transparente à partir de maintenant quand elle arrive à la fin du clip et recommence le clip la transition entre provoque un scintillement pendant une fraction de seconde, ce que je ne peux vraiment pas avoir pour mon application.

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

Le clip ne dure que 22 secondes mais a été créé pour être transparent, il est donc possible de travailler sans délai.

SamRowley
la source

Réponses:

230

Essayez ceci, cela fonctionnera à 100%


VideoView videoView;<--- écrivez ceci en dehors de la méthode ou déclarez-le comme variable finale.

videoView.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setLooping(true);
    }
});
PravinDodia
la source
Toujours rebuffer pour chaque boucle, ce n'est pas lisse comme la méthode avant pour moi
Pencilcheck
@Pencilcheck c'est une simple boucle pour la vidéo locale, si vous voulez l'utiliser pour l'URL et la mettre en mémoire tampon, vous devez implémenter une autre logique.
PravinDodia
FYI à tout le monde, cela ne fonctionne pas non plus pour les vidéos locales. Si vous lisez une vidéo avec un son constant, vous pouvez entendre la pause entre les boucles.
Edison
1
@PravinDodia Cela fonctionne pour la vidéo mp4 (fichier) mais ne fonctionne pas avec m3u8. Veuillez me suggérer une solution si vous avez une idée sur le fichier m3u8.
Maroti du
2
@PravinDodia Merci pour l'info. Oui, j'ai utilisé la vidéo en continu. J'ai utilisé vv.start () dans MediaPlayer.OnCompletionListener () au lieu de boucler.
Maroti du
7

Je ne sais pas si cela aide des années plus tard, mais j'ai utilisé

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

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

et il a une boucle parfaite

lexode k
la source
5

La pause permet au sous-jacent MediaPlayerd'actualiser ses tampons. Le temps que cela prendra dépendra d'un certain nombre de facteurs, dont beaucoup sont hors de votre contrôle (par exemple, la vitesse du processeur, la vitesse du stockage flash intégré).

Un que vous pouvez contrôler est d'extraire votre vidéo de la ressource et de la placer dans le système de fichiers. Les ressources sont stockées dans l'APK, qui est un fichier ZIP, donc l'extraction de la vidéo de cette manière prend probablement plus de temps.

Vous devrez peut-être changer VideoViewet utiliser un SurfaceViewavec deux MediaPlayers, en alternant entre eux - l'un joue pendant que le suivant se prépare, donc lorsque la lecture se termine, vous pouvez passer au nouveau lecteur. Je n'ai pas essayé cela et je ne sais donc pas quelles pourraient être les ramifications. Cependant, je sais que cette technique est fréquemment utilisée pour la lecture audio pour passer d'un clip à un autre.

CommonsWare
la source
Si je me souviens bien, les MediaPlayers conservent surfaceViews lors de la préparation, vous ne pouvez donc pas préparer un autre MediaPlayer pendant que l'on l'utilise.
Edison
2

Dans Kotlin, utilisez simplement

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

Peu de retard, mais une raison pour laquelle vous ne pouvez pas utiliser ce qui suit?

MediaPlayer.setLooping(true);
JJ
la source
1
C'était il y a longtemps, mais avec cela, je pense qu'il y a eu une pause notable dans la vidéo lorsque la boucle a été appelée.
SamRowley
1

Si vous utilisez 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");
                }
            });

Utilisation de la forme abrégée de l'expression de flèche

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

La réponse à cela est de supprimer l'audio de la vidéo et de le convertir en un .oggfichier qui peut être mis en boucle de manière transparente, puis d'utiliser la vidéo sans audio pour faire une boucle et cela fonctionne.

SamRowley
la source