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

모든 루프에 대해 여전히 rebuffer, 그것은 나에게 이전의 방법처럼 부드럽 지 않다
Pencilcheck

@Pencilcheck 이것은 로컬 비디오에 대한 간단한 루핑입니다. URL에 사용하고 버퍼링하려면 다른 논리를 구현해야합니다.
PravinDodia 2014 년

모두에게 참고로, 이것은 로컬 비디오에서도 작동하지 않습니다. 일정한 소리로 동영상을 재생하면 루프 사이의 멈춤을들을 수 있습니다.
에디슨

1
@PravinDodia mp4 비디오 (파일)에서는 작동하지만 m3u8에서는 작동하지 않습니다. m3u8 파일에 대한 아이디어가 있으면 해결책을 제안하십시오.
Maroti

2
@PravinDodia 정보 주셔서 감사합니다. 예, 스트림 비디오를 사용했습니다. 루핑 대신 MediaPlayer.OnCompletionListener ()에서 vv.start ()를 사용했습니다.
Maroti 2015

7

이것이 몇 년 후 도움이되는지 확실하지 않지만

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

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

원활한 루프가 있습니다.


5

일시 중지는 기본 MediaPlayer이 버퍼를 새로 고치는 것입니다. 걸리는 시간은 여러 요인에 따라 달라지며, 그 중 많은 요인이 제어 할 수 없습니다 (예 : CPU 속도, 온보드 플래시 스토리지 속도).

제어 할 수있는 한 가지는 리소스에서 파일 시스템으로 비디오를 가져 오는 것입니다. 리소스는 ZIP 파일 인 APK에 저장되므로이 방법으로 동영상을 추출하는 데 시간이 더 걸릴 수 있습니다.

당신은 멀리 전환해야 VideoView하고를 사용하는 SurfaceView두 사람과 함께 MediaPlayers연주 일단 당신이 새로운 플레이어로 전환 할 수 있도록하는 경우, 다음이 준비되는 동안 하나가 재생되는 - 그들 사이의 교류. 나는 이것을 시도하지 않았으므로 결과가 무엇인지 모르겠습니다. 그러나이 기술은 한 클립에서 다른 클립으로 전환하기 위해 오디오 재생에 자주 사용된다는 것을 알고 있습니다.


내가 올바르게 기억한다면 MediaPlayers는 준비 할 때 surfaceViews를 유지하므로 사용하는 동안 다른 mediaPlayer를 준비 할 수 없습니다.
에디슨

3

Kotlin에서는 간단히

videoView.setOnPreparedListener { it.isLooping = true }

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

Arrow Expression 약식 사용

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

0

이에 대한 대답은 비디오에서 오디오를 제거하고 .ogg이를 원활하게 반복 할 수 있는 파일 로 변환 한 다음 오디오가없는 비디오를 사용하여 순환하면 작동합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.