Vòng lặp video liền mạch với VideoView


88

Tôi có mã sau để lấy video làm tài nguyên thô, bắt đầu video và lặp lại nó nhưng tôi cần video lặp lại liền mạch kể từ bây giờ khi đến cuối clip và bắt đầu lại clip, quá trình chuyển đổi giữa các nguyên nhân nhấp nháy trong tích tắc, điều mà tôi thực sự không thể có cho ứng dụng của mình.

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

Đoạn clip chỉ dài 22 giây nhưng được tạo sự liền mạch nên có thể làm việc mà không bị chậm trễ.

Câu trả lời:


230

Hãy thử nó sẽ hoạt động 100%


VideoView videoView;<--- ghi điều này vào bên ngoài phương thức hoặc nếu không thì khai báo nó là biến cuối cùng.

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

Vẫn rebuffer cho mỗi vòng lặp, nó không mịn như phương pháp này trước khi đối với tôi
Pencilcheck

@Pencilcheck đây là vòng lặp đơn giản cho video cục bộ, nếu bạn muốn sử dụng nó cho url và đệm nó, thì bạn phải triển khai logic khác.
PravinDodia

FYI cho tất cả mọi người, Điều này cũng không hoạt động với các video cục bộ. Nếu bạn phát video với âm thanh không đổi, bạn có thể nghe thấy tiếng tạm dừng giữa các vòng.
Edison

1
@PravinDodia Nó hoạt động với video mp4 (Tệp) nhưng không hoạt động với m3u8. Vui lòng đề xuất cho tôi một giải pháp nếu bạn có bất kỳ Ý tưởng nào về tệp m3u8.
Maroti

2
@PravinDodia Cảm ơn vì thông tin. Có, tôi đã sử dụng video phát trực tuyến. Tôi đã sử dụng vv.start () trong MediaPlayer.OnCompletionListener () thay vì lặp lại.
Maroti

7

Không chắc liệu điều này có giúp ích nhiều năm sau không, nhưng tôi đã sử

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

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

và nó có một vòng lặp liền mạch


5

Việc tạm dừng là để bên dưới MediaPlayerlàm mới bộ đệm của nó. Điều đó sẽ mất bao lâu tùy thuộc vào một số yếu tố, nhiều yếu tố nằm ngoài tầm kiểm soát của bạn (ví dụ: tốc độ CPU, tốc độ lưu trữ flash trên bo mạch).

Một cách bạn có thể kiểm soát là đưa video của bạn ra khỏi tài nguyên và vào hệ thống tệp. Tài nguyên được lưu trữ trong APK, là tệp ZIP, vì vậy việc trích xuất video theo cách này có thể mất thêm thời gian.

Bạn có thể cần phải chuyển từ VideoViewvà sử dụng một SurfaceViewvới hai MediaPlayers, xen kẽ giữa chúng - một cái đang chơi trong khi cái tiếp theo đang chuẩn bị, vì vậy khi trò chơi kết thúc, bạn có thể chuyển sang trình phát mới. Tôi đã không thử điều này, và vì vậy tôi không biết phân nhánh có thể là gì. Tuy nhiên, tôi biết rằng kỹ thuật này thường được sử dụng để phát lại âm thanh để chuyển từ clip này sang clip khác.


Nếu tôi nhớ không nhầm thì MediaPlayers giữ trên surfaceViews khi chuẩn bị, vì vậy bạn không thể chuẩn bị một mediaPlayer khác khi một người đang sử dụng nó.
Edison

2

Trong Kotlin chỉ cần sử dụng

videoView.setOnPreparedListener { mp -> mp.isLooping = true }

1

Hơi muộn, còn lý do gì mà bạn không thể sử dụng những thứ sau đây?

MediaPlayer.setLooping(true);

1
Đây là một thời gian dài trước đây, nhưng với điều đó, tôi nghĩ rằng có một khoảng dừng đáng chú ý trong video khi vòng lặp xung quanh được gọi.
SamRowley

1

Nếu bạn đang sử dụng 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");
                }
            });

Sử dụng biểu thức mũi tên rút gọn

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

0

Câu trả lời cho điều này là xóa âm thanh khỏi video và chuyển đổi âm thanh đó thành một .oggtệp có thể được lặp lại liền mạch và sau đó sử dụng video không có âm thanh để lặp lại và điều này hoạt động.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.