Nahtlose Video-Schleife mit VideoView

87

Ich habe den folgenden Code, um ein Video als Rohressource zu nehmen, das Video zu starten und es zu schleifen, aber ich brauche das Video, um ab sofort nahtlos zu schleifen, wenn es zu einem Ende des Clips kommt und den Clip erneut startet. Der Übergang zwischen den Ursachen a flackere für den Bruchteil einer Sekunde, was ich für meine App wirklich nicht haben kann.

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

Der Clip ist nur 22 Sekunden lang, wurde jedoch nahtlos erstellt, sodass Sie ohne Verzögerung arbeiten können.

SamRowley
quelle

Antworten:

226

Versuchen Sie dies, es wird 100% funktionieren


VideoView videoView;<--- schreibe dies außerhalb der Methode ein oder deklariere es als endgültige Variable.

videoView.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setLooping(true);
    }
});
PravinDodia
quelle
Immer noch Rebuffer für jede Schleife, es ist nicht glatt wie die Methode vor mir
Pencilcheck
@Pencilcheck Dies ist eine einfache Schleife für lokales Video. Wenn Sie es für die URL verwenden und es puffern möchten, müssen Sie eine andere Logik implementieren.
PravinDodia
Zu Ihrer Information an alle, dies funktioniert auch nicht für lokale Videos. Wenn Sie ein Video mit konstantem Ton abspielen, können Sie die Pause zwischen den Loops hören.
Edison
1
@PravinDodia Es funktioniert für MP4-Videos (Datei), aber nicht mit m3u8. Bitte schlagen Sie mir eine Lösung vor, wenn Sie eine Idee zur m3u8-Datei haben.
Maroti
2
@PravinDodia Danke für die Info. Ja, ich habe Stream-Video verwendet. Ich habe vv.start () in MediaPlayer.OnCompletionListener () anstelle einer Schleife verwendet.
Maroti
6

Ich bin mir nicht sicher, ob das Jahre später hilft, aber ich habe es benutzt

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

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

und es hat eine nahtlose Schleife

Lexodus k
quelle
5

In der Pause MediaPlayeraktualisiert der Basiswert seine Puffer. Wie lange dies dauern wird, hängt von einer Reihe von Faktoren ab, von denen viele außerhalb Ihrer Kontrolle liegen (z. B. Geschwindigkeit der CPU, Geschwindigkeit des integrierten Flash-Speichers).

Eine Möglichkeit, die Sie steuern können, besteht darin, Ihr Video aus der Ressource in das Dateisystem zu übertragen. Ressourcen werden in der APK gespeichert, bei der es sich um eine ZIP-Datei handelt. Das Extrahieren des Videos auf diese Weise dauert wahrscheinlich länger.

Möglicherweise müssen Sie von zwei abwechseln VideoViewund eine SurfaceViewmit zwei MediaPlayersabwechseln - eine spielt, während sich die nächste vorbereitet. Wenn die nächste endet, können Sie zum neuen Spieler wechseln. Ich habe dies nicht versucht und weiß daher nicht, welche Auswirkungen dies haben könnte. Ich weiß jedoch, dass diese Technik häufig für die Audiowiedergabe verwendet wird, um von einem Clip zu einem anderen zu wechseln.

CommonsWare
quelle
Wenn ich mich richtig erinnere, halten MediaPlayer bei der Vorbereitung an oberflächenansichten fest, sodass Sie keinen anderen mediaPlayer vorbereiten können, während einer verwendet wird.
Edison
1

Etwas spät, aber aus irgendeinem Grund können Sie Folgendes nicht verwenden?

MediaPlayer.setLooping(true);
JJ
quelle
1
Das ist lange her, aber damit gab es meiner Meinung nach eine merkliche Pause im Video, als die Schleife aufgerufen wurde.
SamRowley
1

Wenn Sie Kotlin verwenden

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

Verwenden der Kurzform "Pfeilausdruck"

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

Die Antwort darauf besteht darin, das Audio aus dem Video zu entfernen und es in eine .oggDatei zu konvertieren, die nahtlos geloopt werden kann. Anschließend wird das Video ohne Audio zum Schleifen verwendet. Dies funktioniert.

SamRowley
quelle
0

In Kotlin einfach benutzen

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