2012-12-12 12 views
10

Chcę pokazać użytkownikowi ProgressDialog jakiś czas oczekiwania na rozpoczęcie VideoView, aby rozpocząć odtwarzanie HLS. Próbuję użyć OnPreparedListener do tego, ale on uruchamia się wcześniej (po pobraniu pliku m3u8, a nie po rozpoczęciu wideo).VideoView wyzwala OnPreparedListener zbyt wcześnie dla HLS

VideoView player = (VideoView) findViewById(R.id.player); 
String httpLiveUrl = "http://example.com/playlist.m3u8"; 

player.setVideoURI(Uri.parse(httpLiveUrl)); 
player.setMediaController(new MediaController(this)); 
player.requestFocus(); 

player.setOnPreparedListener(new OnPreparedListener() { 
public void onPrepared(MediaPlayer mp) { 
    progress.dismiss(); 
} 
}); 

progress.show(); 
player.start(); 

Nie znalazłem innego odpowiedniego listnera ... Może ktoś zna sloution?

+0

Przejdź do Handler.PostDelayed() – Behnam

Odpowiedz

15

Dziękuję wszystkim. Rozwiązałem mój problem z kolejnym hackerem:

videoView.setOnPreparedListener(new OnPreparedListener() { 
    public void onPrepared(MediaPlayer mp) { 

     final Handler handler = new Handler(); 
     videoPositionThread = new Runnable() { 
      public void run() { 
       try { 
        int duration = videoView.getCurrentPosition(); 
        if (!(videoPosition == duration && videoView.isPlaying())) { 
         progress.dismiss(); 
        } 
        videoPosition = duration; 
        handler.postDelayed(videoPositionThread, 1000); 
       } catch (IllegalArgumentException e) { 
        Log.d(TAG, e.getMessage(), e); 
       } 
      } 
     }; 
     handler.postDelayed(videoPositionThread, 0); 
    } 
}); 
+1

Czy możesz mi pomóc? czym jest videoPosition? –

+0

Nie wiem, dlaczego mój podgląd wideo pokazuje strumień wideo na żywo po ponad 15 lub 20 sekundach opóźnienia. –

1

Doświadczyłem tego samego problemu i znalazłem rozwiązanie dla moich potrzeb. Może to też działa dla ciebie. Przynajmniej jest testowany & działa na systemach Android 2.2, 2.3 i 4.2.

Chodzi o to, aby okresowo sprawdzać, czy wideoView aktualna pozycja jest większa niż zero. To modyfikacja odpowiedzi mikhaila. Dzięki mikhail też :)

public class VideoViewActivity extends Activity { 

    // Declare variables 
    ProgressDialog pDialog; 
    VideoView videoview; 
    Runnable videoPositionThread; 

    // Insert your Video URL 
    String VideoURL = "enter your video rtsp url here"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.videoview_main); 
     videoview = (VideoView) findViewById(R.id.VideoView); 

     pDialog = new ProgressDialog(VideoViewActivity.this); 
     pDialog.setTitle("Android Video Streaming Tutorial"); 
     pDialog.setMessage("Buffering..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 

     Uri video = Uri.parse(VideoURL); 
     videoview.setVideoURI(video); 
     videoview.start(); 

     final Handler handler = new Handler(); 
     videoPositionThread = new Runnable() { 
      public void run() { 
       int currentPosition = videoview.getCurrentPosition(); 

       if (currentPosition > 0) 
        pDialog.dismiss(); 
       else 
        handler.postDelayed(videoPositionThread, 1000); 
      } 
     }; 

     handler.postDelayed(videoPositionThread, 0); 
    } 
}