VideoView ile sorunsuz video döngüsü


88

Bir videoyu ham kaynak olarak almak, videoyu başlatmak ve döngülemek için aşağıdaki koda sahibim, ancak videonun şu andan itibaren klibin sonuna geldiği ve klibi tekrar başlattığı andan itibaren sorunsuz bir şekilde döngüye girmesine ihtiyacım var. uygulamam için gerçekten sahip olamadığım bir an için titriyor.

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

Klip yalnızca 22 saniye uzunluğundadır, ancak kesintisiz olması için oluşturulmuştur, bu nedenle gecikme olmadan çalışmak mümkündür.

Yanıtlar:


230

Bunu deneyin,% 100 çalışacak


VideoView videoView;<--- bunu yöntemin dışında yazın veya son değişken olarak bildirin.

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

Yine de her döngü için yeniden
tamponlama yapıyorum

@Pencilcheck bu yerel video için basit döngüdür, eğer onu url için kullanmak ve arabelleğe almak istiyorsanız, o zaman başka bir mantık uygulamanız gerekir.
PravinDodia

Bilginize, Bu yerel videolar için de geçerli değil. Sabit sesli bir video oynatırsanız, döngülerin arasındaki duraklamayı duyabilirsiniz.
Edison

1
@PravinDodia mp4 video (Dosya) için çalışıyor ancak m3u8 ile çalışmıyor. M3u8 dosyası hakkında herhangi bir fikriniz varsa lütfen bana bir çözüm önerin.
Maroti

2
@ PravinDodia Bilgi için teşekkürler. Evet, video akışı kullandım. MediaPlayer.OnCompletionListener () içinde döngü yerine vv.start () kullandım.
Maroti

7

Bunun yıllar sonra yardımcı olup olmadığından emin değilim, ama kullandım

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

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

ve kesintisiz bir döngüye sahip


5

Duraklama, temelde MediaPlayerbulunanların arabelleklerini yenilemesidir. Bunun ne kadar süreceği, çoğu kontrolünüz dışında olan bir dizi faktöre bağlı olacaktır (örneğin, CPU hızı, yerleşik flash depolama hızı).

Kontrol edebileceğiniz bir şey, videonuzu kaynaktan çıkarıp dosya sistemine almaktır. Kaynaklar bir ZIP dosyası olan APK'de depolanır, bu nedenle videoyu bu şekilde çıkarmak muhtemelen fazladan zaman alır.

İkisinden uzaklaşıp ikisini birlikte VideoViewkullanmanız gerekebilir - biri hazırlanırken diğeri çalıyor, böylece oyun bittiğinde yeni oyuncuya geçebilirsiniz. Bunu denemedim ve bu yüzden sonuçların ne olabileceğini bilmiyorum. Bununla birlikte, bu tekniğin bir klipten diğerine geçiş için ses çalmada sıklıkla kullanıldığını biliyorum.SurfaceViewMediaPlayers


Doğru hatırlıyorsam, MediaPlayer hazırlanırken SurfaceViews'a tutunur, bu yüzden bir mediaPlayer'ı kullanırken başka bir mediaPlayer hazırlayamazsınız.
Edison

3

Kotlin'de sadece şunu kullanın:

videoView.setOnPreparedListener { it.isLooping = true }

1

Biraz geç ama aşağıdakileri kullanamamanız için herhangi bir sebep var mı?

MediaPlayer.setLooping(true);

1
Bu uzun zaman önceydi, ancak bununla birlikte döngü çağrıldığında videoda gözle görülür bir duraklama olduğunu düşünüyorum.
SamRowley

1

Kotlin kullanıyorsanız

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

Ok İfadesi kısa biçimini kullanma

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

0

Bunun cevabı, sesi videodan çıkarmak ve .oggbunu sorunsuz bir şekilde döngüye alınabilen bir dosyaya dönüştürmek ve ardından videoyu döngü için ses olmadan kullanmaktır ve bu işe yarar.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.