2011-10-23 3 views
14

VideoView가 버퍼링 중일 때 감지 할 수 있는지 아는 사람 있습니까?VideoVIew가 버퍼링되는지 감지합니다.

비디오가 버퍼링 될 때 ProgressDialog를 표시하려고합니다.

지금까지 OnPreparedListener를 사용해 보았지만 비디오가 처음로드 될 때만 작동합니다. 비디오가 재생 중이고 사용자가 스크럽 막대를 다른 지점으로 이동하면 비디오는 버퍼링 중이더라도 "준비"상태입니다.

나는 또한 (나는이 끔찍한 알고) 시도 isPlaying()에 그저 바쁜 대기가 AsyncThread :

private class BufferTask extends AsyncTask<Void, Void, Void> { 

    protected Void doInBackground(Void...voids) { 
    final VideoView videoView = (VideoView)findViewById(R.id.video); 
    while (!videoView.isPlaying()) { } 
    return null; 
    } 

protected void onPostExecute(Void v) { 
    // Hide the dialog here... 
} 
} 

이 즉시 시작을 부르는 때문에 작동하지 않습니다()는 VideoView를 지켜 보면서이 보인다 비록 그것이 완충 작용을하고 있다고해도 간주된다.

제가 생각할 수있는 유일한 해결책은 MediaPlayer 인스턴스에 액세스 할 수 있도록 맞춤형 VideoView 유형 클래스를 만드는 것입니다.

아이디어가 있으십니까? 읽어 주셔서 감사합니다.

+1

문제가 해결 되었습니까? –

답변

1

비슷한 작업을하고 있는데 훌륭한 해결책이 없었습니다. 일부 흥미로운 솔루션은 게시되지 않은 경우 체크 아웃해야 here 게시했습니다.

어쨌든, 나는 위의 스레드에서 암시되었으며 지금은 잘 작동하는 다음 해킹을 생각해 냈습니다.

@Override 
public void onBufferingUpdate(MediaPlayer mp, int percent) { 
    float temp = ((float)mp.getCurrentPosition()/(float)mp.getDuration())*100; 
    if(Math.abs(percent - temp) < 1) { 
     buffer_fail++; 
     if(buffer_fail == 15) { 
      //buffer failed 
     } 
    } 
} 
+0

VideoView에서는 사용할 수 없습니다. – Rui

+2

VideoView.setOnPreparedListener에서 가져온 MediaPlayer와 함께 사용하십시오. –

9

사용자 정의 VideoView를 구현하지 않기 위해 다음과 같은 해킹이있었습니다. 현재 위치가 1 초 전에 동일하면 1 초마다 확인하는 것이 좋습니다. 맞으면 비디오가 버퍼링됩니다. 그렇지 않은 경우 동영상이 실제로 재생 중입니다.

final Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 
    public void run() { 
     int duration = videoView.getCurrentPosition(); 
     if (old_duration == duration && videoView.isPlaying()) { 
      videoMessage.setVisibility(View.VISIBLE); 
     } else { 
      videoMessage.setVisibility(View.GONE); 
     } 
     old_duration = duration; 

     handler.postDelayed(runnable, 1000); 
    } 
}; 
handler.postDelayed(runnable, 0); 

videoMessage는 내 VideoView의 가운데에 "Buffering ..."텍스트가있는 TextView입니다.

+3

이것은 재귀적인 지수 - 메모리 - 소비자 코드처럼 보입니다. 그렇지 않니? – Behnam

7

API level 17 때문에, 당신은 지금 MediaPlayer를에서 InfoListener에 액세스 할 수 있습니다

final MediaPlayer.OnInfoListener onInfoToPlayStateListener = new MediaPlayer.OnInfoListener() { 

    @Override 
    public boolean onInfo(MediaPlayer mp, int what, int extra) { 
     switch (what) { 
      case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START: { 
       mProgressBar.setVisibility(View.GONE); 
       return true; 
      } 
      case MediaPlayer.MEDIA_INFO_BUFFERING_START: { 
       mProgressBar.setVisibility(View.VISIBLE); 
       return true; 
      } 
      case MediaPlayer.MEDIA_INFO_BUFFERING_END: { 
       mProgressBar.setVisibility(View.VISIBLE); 
       return true; 
      } 
     } 
     return false; 
    } 

}); 

mVideoView.setOnInfoListener(onInfoToPlayStateListener); 
+1

버퍼링이 끝나면 진행 상황을 숨겨서는 안됩니까? –

4

다음 코드는 버퍼링 대화에게 VideoView를 지켜 보면서 버퍼링 때마다 표시됩니다.

final ProgressDialog bufferingDialog; 
    bufferingDialog = ProgressDialog.show(context, 
      "Buffering", "Please wait", true, true); 

    VideoView videoView; 
    videoView = (VideoView) findViewById(R.id.video_view); 
    videoView.setVideoPath(path); 
    videoView.setMediaController(new MediaController(context)); 
    videoView.requestFocus(); 
    videoView.start(); 
    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      mp.setOnInfoListener(new MediaPlayer.OnInfoListener() { 
       @Override 
       public boolean onInfo(MediaPlayer mp, int what, int extra) { 
        if (what == MediaPlayer.MEDIA_INFO_BUFFERING_START) 
         bufferingDialog.show(); 
        if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END) 
         bufferingDialog.dismiss(); 
        return false; 
       } 
      }); 
     } 
    }); 
    videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { 
     @Override 
     public boolean onError(MediaPlayer mp, int what, int extra) { 
      bufferingDialog.dismiss(); 
      return false; 
     } 
    }); 
관련 문제