2011-01-25 4 views
0

나는 VideoView을 사용하여 Android를 사용하여 동영상 플레이어를 구성하고 있습니다. 저는 비디오 플레이어를 사용할 수있게되었습니다. 이제는 파일을 선택했을 때 크로노을 사용하여 카운터를 설정하고 있습니다.
그러나 클립이 시작될 때 타이머가 이미 몇 초 계산되기 시작하면서 비디오 클립은 실행을 시작하는 데 몇 초가 걸립니다.타이머가있는 Android Sync 동영상

어떻게하면 카운터를 미디어 파일과 동기화 할 수 있습니까?
주변을 살펴 보았지만 답변을 찾지 못하는 것 같습니다.

video = (VideoView) findViewById(R.id.video); 
    play = (Button) findViewById(R.id.play); 
    pause = (Button) findViewById(R.id.pause); 
    stop = (Button) findViewById(R.id.stop); 
    reset = (Button) findViewById(R.id.reset); 
    Chronometer counter = (Chronometer) findViewById(R.id.chrono); 
    startTime = SystemClock.elapsedRealtime(); 
    time = (TextView) findViewById(R.id.time); 

     try { 
     video.setVideoPath(link); 
     video.start(); 
     video.requestFocus(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } 

    play.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      video.start(); 
      video.requestFocus(); 
     } 
    }); 
    pause.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      video.pause(); 
     } 
    }); 
    stop.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      try { 
       video.stopPlayback(); 
       video.setVideoPath(link); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
    reset.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      try { 
       video.seekTo(0); 
       video.start(); 
       video.requestFocus(); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

counter.setOnChronometerTickListener(new OnChronometerTickListener(){ 
     public void onChronometerTick(Chronometer arg0) { 
      countUp = (SystemClock.elapsedRealtime() - arg0.getBase())/1000; 
      duration = video.getDuration(); 
      if (countUp % 60 <= 9) { 
       countText = (countUp/60) + ":0" + (countUp % 60); 
      } else { 
       countText = (countUp/60) + ":" + (countUp % 60);   
      } 
      if (duration % 60000 <= 9) { 
       durationText = (duration/60000) + ":0" + (duration % 60000); 
      } else { 
       durationText = (duration/60000) + ":" + (duration % 60000);   
      } 
      time.setText(countText + "/" + durationText); 
     } 
    }); 
    counter.start(); 

답변

0

걱정 마, 내가 크로노 미터에 VideoView를 지켜 보면서 getCurrentPosition()를 사용하는 방법을 찾을 수 없습니다. 이제 항상 정확한 현재 시간을 볼 수 있으며 확인하기가 더 쉽습니다.

counter.setOnChronometerTickListener(new OnChronometerTickListener(){ 
     public void onChronometerTick(Chronometer arg0) { 
      countUp = video.getCurrentPosition(); 
      countUp = Math.round(countUp/1000); 
      duration = video.getDuration(); 
      duration = duration/1000; 
      long a = (long) countUp; 
      if (countUp % 60000 <= 9) { 
       countText = (a/60000) + ":0" + (a % 60000); 
      } else { 
       countText = (a/60000) + ":" + (a % 60000);   
      } 
      if (duration % 60000 <= 9) { 
       durationText = (duration/60000) + ":0" + (duration % 60000); 
      } else { 
       durationText = (duration/60000) + ":" + (duration % 60000);   
      } 
      time.setText(countText + "/" + durationText); 
     } 
    }); 
    counter.start(); 
0

저는 다른 사람들에게 도움이 될 수 있으므로이 두 센트를 알려 드리겠습니다.

MediaPlayer를 가져올 수있는 onPreparedListener를 설정할 수 있습니다. MediaPlayer에는 미디어가 버퍼링되는 시점 또는 실제로 렌더링되는 첫 번째 프레임까지 알려주는 onInfoListener가 있습니다. MEDIA_INFO_VIDEO_RENDERING_START (API 17+ 만). 재정의 한 VideoView 클래스에서 로컬 상태 변수 (예 : enum VideoPlayerState (BUFFERING, PLAYING, STOPPED, OPEN, PAUSED))를 업데이트하는 데 사용하고 있습니다. 상태가 변경 될 때 콜백을 얻기 위해 설정기를 재정의 할 수 있습니다. 콜백을 사용하면 타이머를 시작/일시 중지 할 수 있습니다.

setOnPreparedListener(new OnPreparedListener() { 
     @Override 
     public void onPrepared(final MediaPlayer mp) { 
      mp.setOnInfoListener(new OnInfoListener() { 

       @Override 
       public boolean onInfo(MediaPlayer mp, int what, int extra) { 
        if (what == MediaPlayer.MEDIA_INFO_BUFFERING_START) { 
         setPlayerState(VideoPlayerState.BUFFERING); 
        } else if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END) { 
         if (mp.isPlaying() 
           && mPlayerState == VideoPlayerState.BUFFERING) { 
          setPlayerState(VideoPlayerState.PLAYING); 
         } 
        } 
        return false; 
       } 
      }); 
}); 

또한 상태를 전환 할 VideoView를 지켜 보면서 이러한 메소드를 오버라이드 (override) 할 수 있습니다

@Override 
public void pause() { 
    super.pause(); 
    setPlayerState(VideoPlayerState.PAUSED); 
} 

@Override 
public void start() { 
    super.start(); 
    setPlayerState(VideoPlayerState.PLAYING); 
} 

@Override 
public void stopPlayback() { 
    super.stopPlayback(); 
    setPlayerState(VideoPlayerState.STOPPED); 
} 

그것이 도움이되기를 바랍니다.

관련 문제