2011-01-20 2 views
60

비디오를 원시 리소스로 가져 와서 비디오를 시작하고 반복하려면 다음 코드를 사용합니다. 클립 끝나고 시작될 때 원활하게 반복되도록 비디오가 필요합니다. 다시 클립 사이의 전환은 정말 내 애플 리케이션을 가질 수 없어, 초 동안 깜박임이 발생합니다.Seamless Video Loop with VideoView

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 초이지만 끊김없이 작업 할 수 있도록 끊김없이 제작되었습니다.

답변

149

당신이 setOnCompletionListener 클래스에서 vv.resume를 사용해야합니다, 100 %


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

모든 루프에 대해 여전히 rebuffer가 있습니다. 이전 방법으로는 부드럽지 않습니다. – Pencilcheck

+0

@Pencilcheck URL을 사용하여 버퍼링하고 싶다면 다른 로직을 구현해야한다는 점에서 로컬 비디오에 대한 간단한 루핑입니다. – PravinDodia

+0

안녕하십니까, 로컬 동영상의 경우에도 작동하지 않습니다. 일정한 사운드의 비디오를 재생하면 두 루프 사이에서 일시 중지음을들을 수 있습니다. – Edison

4

일시 중지는 기본 버퍼 인 MediaPlayer의 버퍼를 새로 고치는 것입니다. 얼마나 오래 걸릴지는 많은 요소 (예 : CPU 속도, 온보드 플래시 저장 속도)에 달려 있습니다.

당신이 제어 할 수있는 한 가지는 비디오에서 리소스와 파일 시스템으로 비디오를 가져 오는 것입니다. 리소스는 ZIP 파일 인 APK에 저장되므로 이러한 방식으로 비디오를 추출하는 데 시간이 오래 걸릴 수 있습니다.

당신은 그들 사이의 교류, VideoView에서 떨어져 전환하고 SurfaceViewMediaPlayers이 함께를 사용해야 할 수도 있습니다 - 하나는 다음이 준비되는 동안 재생, 재생 한 새 플레이어로 전환 할 수 있습니다 종료 그렇게 할 때. 나는 이것을 시도하지 않았으므로 파급 효과가 무엇인지 알지 못한다. 그러나이 기술은 한 클립에서 다른 클립으로 오디오를 재생할 때 자주 사용된다는 것을 알고 있습니다.

+0

을 가지고는, Mediaplayers에는 surfaceViews에 개최. – Edison

0

답은 비디오에서 오디오를 제거하고 원활하게 반복 할 수있는 .ogg 파일로 변환 한 다음 오디오없이 비디오를 사용하여 반복 재생하는 것입니다.

1

조금 늦었지만 다음과 같은 이유로 사용할 수없는 이유는 무엇입니까?

MediaPlayer.setLooping(true); 
+1

이것은 오래전 일이었습니다. 그러나 그걸 가지고 돌아 다니면 비디오에 눈에 띄는 멈춤이 있다고 생각합니다. – SamRowley

1

확실하지 않음 도움이되지만 나중에 사용했습니다.

준비 가져올 때 하나를 사용하는 동안 다른 MediaPlayer를 준비 할 수 있도록 16,
vv.start(); 
vv.setOnCompletionListener (new MediaPlayer.OnCompletionListener() { 

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

내가 정확히 기억 경우가 원활한 루프