Loop video yang mulus dengan VideoView

88

Saya memiliki kode berikut untuk mengambil video sebagai sumber mentah, memulai video dan mengulangnya tetapi saya membutuhkan video untuk mengulang dengan mulus seperti sekarang ketika sampai pada akhir klip dan memulai klip lagi transisi antara menyebabkan a berkedip selama sepersekian detik, yang benar-benar tidak dapat saya miliki untuk aplikasi saya.

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 hanya berdurasi 22 detik tetapi dibuat dengan mulus sehingga memungkinkan untuk bekerja tanpa penundaan.

SamRowley
sumber

Jawaban:

230

Coba ini akan berhasil 100%


VideoView videoView;<--- tulis ini di luar metode atau nyatakan sebagai variabel akhir.

videoView.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setLooping(true);
    }
});
PravinDodia
sumber
Masih menawarkan ulang untuk setiap loop, tidak semulus metode sebelumnya bagi saya
Pencilcheck
@Pencilcheck ini adalah pengulangan sederhana untuk video lokal, jika Anda ingin menggunakannya untuk url dan buffering, maka Anda harus menerapkan logika lain.
PravinDodia
FYI untuk semua orang, Ini tidak berlaku untuk video lokal juga. Jika Anda memutar video dengan suara konstan, Anda dapat mendengar jeda di antara loop.
Edison
1
@PravinDodia Bekerja untuk video mp4 (File) tetapi tidak bekerja dengan m3u8. Tolong sarankan saya solusi jika Anda memiliki Ide tentang file m3u8.
Maroti
2
@PravinDodia Terima kasih atas infonya. Ya, saya telah menggunakan video streaming. Saya telah menggunakan vv.start () di MediaPlayer.OnCompletionListener (), bukan perulangan.
Maroti
7

Tidak yakin apakah ini membantu bertahun-tahun kemudian, tapi saya dulu

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

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

dan memiliki loop yang mulus

lexodus k
sumber
5

Jeda ini untuk mendasari MediaPlayermenyegarkan buffernya. Berapa lama waktu yang dibutuhkan akan bergantung pada sejumlah faktor, banyak di antaranya berada di luar kendali Anda (misalnya, kecepatan CPU, kecepatan penyimpanan flash on-board).

Satu yang dapat Anda kendalikan adalah mengeluarkan video Anda dari sumber daya dan masuk ke sistem berkas. Resource disimpan dalam APK, yang merupakan file ZIP, jadi mengekstrak video dengan cara ini mungkin membutuhkan waktu lebih lama.

Anda mungkin perlu beralih dari VideoViewdan menggunakan a SurfaceViewdengan dua MediaPlayers, bergantian di antara keduanya - satu dimainkan sementara yang berikutnya sedang bersiap, jadi ketika permainan berakhir, Anda dapat beralih ke pemain baru. Saya belum mencobanya, jadi saya tidak tahu apa konsekuensinya. Namun, saya tahu bahwa teknik ini sering digunakan untuk pemutaran audio untuk beralih dari satu klip ke klip lainnya.

CommonsWare
sumber
Jika saya ingat dengan benar, MediaPlayers mempertahankan surfaceViews saat bersiap, jadi Anda tidak dapat menyiapkan mediaPlayer lain saat seseorang sedang menggunakannya.
Edison
3

Di Kotlin cukup gunakan

videoView.setOnPreparedListener { it.isLooping = true }
Chirag Kalra
sumber
1

Sedikit terlambat, tetapi ada alasan mengapa Anda tidak dapat menggunakan yang berikut ini?

MediaPlayer.setLooping(true);
JJ
sumber
1
Ini sudah lama sekali, tetapi dengan itu saya pikir ada jeda yang terlihat di video ketika loop di sekitar dipanggil.
SamRowley
1

Jika Anda menggunakan 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");
                }
            });

Menggunakan bentuk singkat Arrow Expression

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

Jawaban untuk ini adalah untuk menghapus audio dari video dan mengubahnya menjadi .oggfile yang dapat diputar dengan mulus dan kemudian menggunakan video tanpa audio untuk memutar dan ini berfungsi.

SamRowley
sumber