2016-06-21 2 views
0

내부 메모리에서 재생되는 VideoView가 있습니다. 비디오가 재생되는 동안 VideoView 로그에 MediaPlayer: error (1, -1004)이 기록됩니다. 이 오류를 관리하려는 VideoView에 onErrorListener가 연결되어 있습니다. 내가하고자하는 일은 마지막 위치 (getCurrentPosition())를 얻고 seekTo(int position)을 사용하여 그 위치에서 선수를 다시 시작하는 것입니다. 내 비디오 파일이 유효합니다 (다른 플레이어에서 재생하여 확인). 내 문제는 이제 VideoView에서 마지막으로 유효한 위치를 얻는 것입니다. mp.getCurrentPosition/mVideoView.getCurrentPosition() (상당히 바르게)을 수행하면 onError (MediaPlayer mp, int what, int extra)에서 getCurrentPosition()을 호출하면 0이 반환됩니다. 재생되는 동안 플레이어의 현재 위치를 계속 추적하려면 어떻게해야합니까?Android - VideoView, 동영상이 재생 될 때 현재 위치 확인 중입니까?

mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { 
      @Override 
      public boolean onError(MediaPlayer mp, int what, int extra) { 
       switch (what) { 
        case MediaPlayer.MEDIA_ERROR_UNKNOWN: 
         Log.v("error", "media error unknown"); 
         mediaErrorExtra(mp, extra, path); 
         break; 
        case MediaPlayer.MEDIA_ERROR_SERVER_DIED: 
         Log.v("error", "media error server died"); 
         mediaErrorExtra(mp, extra, path); 
         break; 
       } 
       return true; 
      } 
     }); 

private void mediaErrorExtra(MediaPlayer mp, int extra, String path){ 
     switch(extra){ 
      case MediaPlayer.MEDIA_ERROR_IO: 

       if(!mp.isPlaying()){ 
        Integer currentposition = mVideoView.getCurrentPosition(); 
        if(currentposition != null){ 
         Log.v("currentpos",Integer.toString(currentposition)); 
        } 
        mVideoView.setVideoPath(path); 
        mVideoView.start(); 
        //mVideoView.seekTo(currentposition); 
       } 
       break; 
      case MediaPlayer.MEDIA_ERROR_MALFORMED: 
       Log.v("error extra","media error malformed"); 
       break; 
      case MediaPlayer.MEDIA_ERROR_UNSUPPORTED: 
       Log.v("error extra","media error unsupported"); 
       break; 
      case MediaPlayer.MEDIA_ERROR_TIMED_OUT: 
       Log.v("error extra","media error timed out"); 
       break; 
     } 
    } 

또는 재생 중 플레이어의 현재 위치를 제공하는 모든 청취자가 : 여기

내 코드? 내가 while(isPlaying()){int currentposition = mVideoView.getCurrrentPosition()}을 사용할 수는 있지만 이것은 사물에 대한 나쁜 생각이라고 생각합니다. 어떤 제안이라도 대단히 감사 할 것입니다. 미리 감사드립니다.

답변

0

플레이어가 플레이 할 때 현재 위치를 얻습니다.

ScheduledExecutorService mScheduledExecutorService; 
    int mCurrentposition = 0; 
    Runnable UpdateCurrentPosition = new Runnable(){ 

     @Override 
     public void run() { 
      mCurrentposition = mVideoView.getCurrentPosition(); 
     } 
    }; 

    @Override 
    protected void onCreate(){ 
     ... 
     mScheduledExecutorService = new ScheduledExecutor(1); 

     mScheduledExecutorService.scheduleWithFixedDelay(new Runnable(){ 
      @Override 
      public void run() { 
       mVideoView.post(UpdateCurrentPosition); 
      } 
     },3000,1000,TimeUnit.MILLISECONDS); 
    } 
+0

'ScheduledExecutor'기호를 확인할 수 없습니다. – NarendraJi

0

당신은 while으로 올바른 길을 걷고 있습니다.하지만 UI가 완전히 차단 될 것이므로 좀 더 정제해야합니다.

그럼 MediaPlayer 위치에 대해 1 초마다 확인을 트리거하는 Handler을 사용해야합니다. 1 초가 적당하다고 생각합니다.

저는 MediaPlayer 용 SeekBar 사용자 지정을 구현하기 위해이 방법을 사용했으며 완벽하게 작동합니다.

여기

는 방법은 다음과 같습니다

ScheduledExecutorService는이 문제를 해결 도움 : 내 질문에 대답 내가 사용하는 핸들러를 보여

+0

감사합니다. 나는이 방법으로 현재 위치를 얻지 만, 이제는 MediaController의 탐색 바가 나타나지 않습니다. 주위를 돌아 다닐 필요가 있습니다 ... – user1841702

0

...

 private double currentTime = 0; 
    private Handler mHandler = new Handler(); 

    //update Seekbar on UI thread 
    public void updateProgressBar() { 
     if (mHandler != null) { 
      mHandler.postDelayedUpdateProgress 100); 
     } 
    } 

private Runnable UpdateProgress = new Runnable() { 
     public void run() { 
     currentTime = mediaPlayer.getCurrentPosition(); 
     txt.setText(String.format("%d min, %d sec", 
     TimeUnit.MILLISECONDS.toMinutes((long) startTime), 
     TimeUnit.MILLISECONDS.toSeconds((long) startTime) - 
     TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS. 
     toMinutes((long) startTime))) 
     ); 
     seekbar.setProgress((int)startTime); 
     myHandler.postDelayed(this, 100); 
     } 
    }; 

당신은 핸들러를 사용한다 ..