2012-10-14 11 views
8

questa seguente codice sorgente frammento di è dato:Android VideoView MediaPlayer OnInfoListener - gli eventi non hanno sparato

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mediaPlayer) { 

      mediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() { 
       @Override 
       public boolean onInfo(MediaPlayer mp, int what, int extra) { 
        if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END){ 
         activity.dismissDialog(DialogID.DIALOG_LOADING); 
         return true; 
        } 
        return false; 
       } 
      }); 
     } 
    }); 

sto Streaming HLS ruscelli con Android 3.x + dispositivi e cercando di nascondere una finestra di dialogo di carico una volta che il buffer è completato. Lo streaming video funziona, ma gli eventi informativi non vengono mai attivati.

Qualche idea?

+0

Qualcuno può fornire una buona soluzione per questo? –

+0

Mi chiedo se impostare "OnInfoListener" in "onPrepared (...)" sia semplicemente troppo tardi nella catena delle chiamate. La documentazione su 'prepareAsync()' dice quanto segue: * "(...) Per gli stream, dovresti chiamare prepareAsync(), che ritorna immediatamente, ** piuttosto che bloccare fino a quando non sono stati bufferizzati abbastanza dati **." * mi suona come se "onPrepared (...)" non venga colpito fino a quando i buffer non sono già stati riempiti. Qualche modifica a cui hai già dato una riflessione? Questo dovrebbe permetterti di impostare "OnInfoListener" ogni volta che vuoi. –

risposta

0

è possibile in grado di impostare il OnPreparedListener VideoView perché il suo l'oggetto, ma se si checkout fonte di VideoView troverete che mMediaPlayer è il suo membro privato in modo che qualsiasi cambiamento che si fa da esterno non verrà applicata ad esso.

Secondo il vostro requisito è necessario lo stato di buffering in modo da poter avere filo o conduttore o qualche cosa in modo da poter aggiornare l'interfaccia utente per ottenere lo stato del buffer c'è un metodo

int percent = videoView.getBufferPercentage(); 

if(percent == 100){ 
// buffering done 
} 
+2

Avere una lettura nelle note di bounty, questo non è quello che vuole: _ "Non voglio una soluzione * che sondaggi per guardare la testa di gioco per verificare l'avanzamento * che utilizza onBufferUpdate per stimare (basato sul post precedente su "_ – yorkw

+0

per favore controlla quello che ho detto prima para –

+0

@yorkw ha ragione.Se guardi il sorgente AOSP per videoview, getBufferPercentage restituisce lo stesso valore di onBufferUpdate (percentuale) fa. OnBufferUpdate ti dice quanto il contenuto ha bufferizzato rispetto all'intero video. Ad esempio 80% significa che l'80% del video è stato memorizzato nel buffer –

0

Non hai bisogno di passare attraverso setOnInfoListener

sovrascrivendo il metodo setOnPreparedListener è sufficiente. come nel api mostrare

setOnPreparedListener public void (MediaPlayer.OnPreparedListener l)

registrare un callback da richiamare quando viene caricato il file multimediale e pronto ad andare.

modo, è possibile eliminare il vostro dialogo interno metodo setOnPreparedListener è abbastanza

come questo

vv.setOnPreparedListener(new OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 

      handler.post(new Runnable() { 
      @Override 
     public void run() { 
       Toast.makeText(MainActivity.this, "finish11", Toast.LENGTH_LONG).show(); 
     } 
     }); 
     } 
    }); 
+0

Questo non funzionerebbe vedere il post di Cristian –

+0

Qual è il diverso tra il mio risultato e il suo risultato? il buffer è completo. L'ho copiato dall'API Android. Guardalo qui http://developer.android.com/reference/android/widget/VideoView.html#setOn PreparedListener (android.media.MediaPlayer.OnPreparedListener) –

+0

Lasciami reiterare la risposta che ho dato a @Cristian. Questo è qualcosa che ho già provato. Sto cercando di spiegare i buffer underrun che potrebbero essere causati dal buffer iniziale, dai rebuffer a causa delle cattive condizioni della rete o dei rebuffer dovuti alla ricerca. Il tuo metodo non funzionerebbe per nessuno di questi scenari. –

1

onPrepared viene chiamato quando la MediaPlayer è pronta a iniziare il buffering, non quando il video è completamente tamponata . Tuttavia, è completamente naturale chiudere la finestra di dialogo di caricamento all'interno del metodo onPrepared.

anche MEDIA_INFO_BUFFERING_END viene utilizzato quando MediaPlayer si riprende la riproduzione dopo buffer riempimento, quindi non credo che dovrebbe essere qualcosa da usare per chiudere la finestra. Quindi dovrebbe funzionare:

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mediaPlayer) { 
     activity.dismissDialog(DialogID.DIALOG_LOADING); 
    } 
}); 
+0

Questo è qualcosa che ho già provato. Sto cercando di spiegare i buffer underrun che potrebbero essere causati dal buffer iniziale, dai rebuffer a causa delle cattive condizioni della rete o dei rebuffer dovuti alla ricerca. Il tuo metodo non funzionerebbe per nessuno di questi scenari. –

2

Non completamente sicuro di ciò che l'OP sta chiedendo, ma qui ci sono alcune informazioni molto intempestive.

Non mi fiderei di onPrepared. Lo trovo inaffidabile.

Ho trovato le due informazioni più utili per lo streaming HLS attraverso MediaPlayer sono la durata del video e la posizione di avanzamento del video. Otterrai entrambi questi ascoltando aggiornamenti sui progressi.

Quando la durata è maggiore di zero, si sa che il video è veramente preparato e può essere manipolato (scrub). Quando la posizione di avanzamento cambia, sai che il video ha finito il buffering e ha iniziato la riproduzione. Quest'ultimo elemento funziona solo quando il video è in riproduzione, ovviamente. MediaPlayer tende a trasmettere informazioni inaccurate.

Queste informazioni sono per lo più accurate e di solito possono essere considerate come "abbastanza" tempestive. Questa tempestività varia da dispositivo a dispositivo.

0

Se si desidera visualizzare caricare ogni volta che è il buffering (tempo iniziale o successive buffer underrun) solo assicurare a mostrare di nuovo:

// at the beginning 
show 

boolean onInfo(int what, int extra) { 
    switch (what) { 
    case MEDIA_INFO_BUFFERING_END: 
     "hide"; 
     break; 
    case MEDIA_INFO_BUFFERING_START 
     "show": 
    } 
} 

Quindi questa sequenza di eventi farà, se lo desideri:

- whenever you start (setVideoURI or start): show 
- onPrepared: just plug the info listener 
- onInfo BUFFERING_END hide (it's playing) 
- onInfo BUFFERING_START show (it's buffering again) 
- onInfo BUFFERING_END hide (it's playing) 

Aggiornamento:

Ciò presuppone che gli eventi di informazioni funzionino. Ovviamente.

2

So che la sua troppo tardi, ma la pubblicazione per gli utenti ancora in cerca di una soluzione (questo ha funzionato per me):

 progressDialog.show(); 
     videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mediaPlayer) { 
       mediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() { 
        @Override 
        public boolean onInfo(MediaPlayer mp, int what, int extra) { 
         if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END){ 
          progressDialog.dismiss(); 
          return true; 
         } else if(what == MediaPlayer.MEDIA_INFO_BUFFERING_START){ 
          progressDialog.show(); 
         } 
         return false; 
        } 
       }); 
       progressDialog.dismiss(); 
       videoView.start(); 
      } 
     }); 
+0

setOnInfoListener viene generato quando viene avviato un video. Quindi possiamo usarlo per mostrare e nascondere la barra di avanzamento durante il buffering intermedio del video. –