2013-07-24 27 views
8

Sto provando ad ascoltare OnInfoListener di un mediaplayer che ho creato per ottenere quando il buffering inizia e finisce.OnInfoListener non viene mai chiamato

Per qualche motivo l'evento non si accende mai.

Questa è la mia fase di inizializzazione codice

private void initPlayer(Surface s){ 
    mPlayer = new MediaPlayer(); 
    mPlayer.setSurface(s); 


    mPlayer.setOnCompletionListener(this); 
    mPlayer.setOnErrorListener(this); 
    mPlayer.setOnInfoListener(this); 
    mPlayer.setOnPreparedListener(this); 
    mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

    try { 
     mPlayer.setDataSource(file_url); 
     mPlayer.prepare(); 
    } catch (IllegalArgumentException e) { 
     OnError(PLAYER_ERRORS.player_not_loaded, e.getMessage() + ""); 
    } catch (SecurityException e) { 
     OnError(PLAYER_ERRORS.player_not_loaded, e.getMessage() + ""); 
    } catch (IllegalStateException e) { 
     OnError(PLAYER_ERRORS.player_not_loaded, e.getMessage() + ""); 
    } catch (IOException e) { 
     OnError(PLAYER_ERRORS.no_connection, e.getMessage() + ""); 
    } 
} 

E questo è il mio ascoltatore

@Override 
public boolean onInfo(MediaPlayer mp, int what, int extra) { 


    if(what == MediaPlayer.MEDIA_INFO_BUFFERING_START) 
    { 
     OnEvent(PLAYER_EVENT.buffering_start); 
    } 
    else if(what == MediaPlayer.MEDIA_INFO_BUFFERING_END) 
    { 
     OnEvent(PLAYER_EVENT.buffering_end); 
     OnGotDuration(getDuration()); 
    } 

    return what == MediaPlayer.MEDIA_INFO_BUFFERING_START || what == MediaPlayer.MEDIA_INFO_BUFFERING_END; 
} 

Per favore qualcuno può aiutarmi a capire perché sta succedendo questo? Grazie

+1

Stesso issu per me = ( –

+0

è il file che si sta tentando di riprodurre è locale? – Desert

+0

No, si tratta di un flusso di file HLS da un server di terze parti – orelzion

risposta

6

Bene a quanto pare è un bug noto in Android. Durante la riproduzione di stream HLS, non chiama mai OnInfoListener o OnBuffering.

Cercare here per maggiori dettagli

mio cosiddetta soluzione era quella di creare un thread ora corre lungo il lato del lettore, e controllando il suo progresso di volta in volta per determinare se la riproduzione è ferma - assumendo che significa che il il giocatore sta tamponando.

Ecco il mio codice per il quale mai lo vuole

private class BufferingThread extends Thread{ 

    WeakReference<NewDefaultPlayer> player; 
    long currentPos, lastSecond; 
    boolean isBuffering, alreadyBuffering; 
    private Object locker = new Object(); 

    public BufferingThread(NewDefaultPlayer player) { 
     this.player = new WeakReference<NewDefaultPlayer>(player); 
    } 

    private Runnable BufferStart = new Runnable() { 
     public void run() { 
      player.get().OnEvent(PLAYER_EVENT.buffering_start); 
     } 
    }; 

    private Runnable BufferStop = new Runnable() { 
     public void run() { 
      player.get().OnEvent(PLAYER_EVENT.buffering_end); 
     } 
    }; 

    @Override 
    public void run() { 
     super.run(); 

     while(true) 
     { 
      synchronized (locker) { 
       currentPos = player.get().getCurrentPosition(); 
       isBuffering = currentPos == 0 ? true : currentPos <= lastSecond; 
       lastSecond = (int) currentPos; 
       if(alreadyBuffering){ 
        if(!isBuffering) 
        { 
         if(player.get().getPlayerState().equals(PLAYER_STATES.IS_PLAYING)) 
         { 
          alreadyBuffering = isBuffering; 
          TvinciSDK.getMainHandler().post(BufferStop); 
         } 
        } 
       } else { 
        if(isBuffering){ 
         alreadyBuffering = isBuffering; 
         TvinciSDK.getMainHandler().post(BufferStart); 
        } 
       } 
       try { 
        sleep(1500); 
       } catch (InterruptedException e) { 
        break; 
       } 
      } 
     } 

    } 
} 

//Stop the thread if the user has stopped the video 
private void handleBufferingWorkaround(boolean work){ 
    if(bThread == null) 
     bThread = new BufferingThread(this); 
    if(work){ 
     if(!bThread.isAlive()) 
      bThread.start(); 
    } 
    else if(bThread.isAlive()) 
    { 
     bThread.interrupt(); 
     bThread = null; 
    } 
} 

Speranza che aiuta

Problemi correlati