Безшовна відео петля з VideoView


88

У мене є такий код, щоб взяти відео як вихідний ресурс, запустити відео та зациклювати його, але мені потрібно, щоб це відео безперервно крутилося, як тільки він закінчується і починає кліп, перехід між причинами мерехтіння на частку секунди, чого я справді не можу мати для свого додатка.

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

Кліп триває всього 22 секунди, але був створений для безшовної роботи, тому можна працювати без затримок.

Відповіді:


230

Спробуйте це, це спрацює на 100%


VideoView videoView;<--- напишіть це поза методом або ж оголосіть як остаточну змінну.

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

Все ще ребуфер для кожного циклу, це не гладко, як раніше для мене
Pencilcheck

@Pencilcheck це простий цикл для локального відео, якщо ви хочете використовувати його для URL-адреси та буферизації, то вам доведеться застосувати іншу логіку.
PravinDodia

FYI для всіх, це також не працює для місцевих відео. Якщо ви відтворюєте відео з постійним звуком, ви можете почути паузу між циклами.
Едісон

1
@PravinDodia Працює для відео mp4 (Файл), але не працює з m3u8. Будь ласка, підкажіть мені рішення, якщо у вас є ідея щодо файлу m3u8.
Maroti

2
@PravinDodia Дякую за інформацію. Так, я використовував потокове відео. Я використовував vv.start () у MediaPlayer.OnCompletionListener () замість циклу.
Maroti

7

Не впевнений, чи це допомагає роками пізніше, але я використовував

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

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

і він має безшовний цикл


5

Пауза призначена для базового, MediaPlayerщоб оновити свої буфери. Скільки часу це займе, залежатиме від ряду факторів, багато з яких поза вашим контролем (наприклад, швидкість процесора, швидкість вбудованого флеш-накопичувача).

Ви можете керувати тим, як витягнути своє відео з ресурсу у файлову систему. Ресурси зберігаються в файлі .apk, який є ZIP-файлом, тому витягнення відео таким чином, ймовірно, вимагає додаткового часу.

Можливо, вам доведеться відключити VideoViewта використовувати a SurfaceViewз двома MediaPlayers, чергуючи їх - одна грає, а наступна готується, тому, коли гра закінчується, ви можете переключитися на нового гравця. Я не пробував цього, тому не знаю, якими можуть бути наслідки. Однак я знаю, що цей прийом часто використовується для відтворення аудіо для переходу від одного кліпу до іншого.


Якщо я добре пам’ятаю, MediaPlayers тримаються за surfaceViews під час підготовки, тож ви не можете підготувати інший mediaPlayer, поки хтось ним користується.
Едісон


1

Трохи пізно, але є якась причина, через яку ви не можете використати наступне?

MediaPlayer.setLooping(true);

1
Це було дуже давно, але, маючи на увазі, у відео сталася помітна пауза, коли була викликана петля навколо.
SamRowley

1

Якщо ви використовуєте 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");
                }
            });

Використання короткої форми виразу стрілки

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

0

Відповідь на це полягає у тому, щоб видалити аудіо з відео та перетворити його у .oggфайл, який можна легко перемикати, а потім використовувати відео без звуку для кругообігу, і це працює.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.