2013-07-24 42 views
8

Tôi đang cố gắng nghe OnInfoListener của trình phát đa phương tiện mà tôi đã tạo để nhận khi bắt đầu và kết thúc bộ đệm.OnInfoListener không bao giờ được gọi là

Vì lý do nào đó sự kiện không bao giờ xảy ra.

này được tôi khởi đang

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() + ""); 
    } 
} 

Và đây là người biết lắng nghe tôi

@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; 
} 

Ai đó có thể vui lòng giúp tôi hiểu tại sao điều này xảy ra? Cảm ơn

+1

Cùng issu cho tôi = ( –

+0

là tập tin bạn đang cố gắng để chơi là địa phương? – Desert

+0

Không, nó là một tập tin HLS trực tuyến từ máy chủ của bên thứ ba – orelzion

Trả lời

6

Dường như đó là lỗi đã biết trong Android. Khi phát luồng HLS, nó chỉ không bao giờ gọi OnInfoListener hoặc OnBuffering.

Look here để biết thêm chi tiết

tôi cái gọi là giải pháp là tạo ra một chủ đề hiện nay chạy dọc bên của người chơi, và kiểm tra sự tiến bộ của mình trong từng thời kỳ để xác định xem phát lại dừng lại - giả định rằng có nghĩa là người chơi đang lưu vào bộ đệm.

Dưới đây là mã của tôi cho ai bao giờ muốn nó

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; 
    } 
} 

Hy vọng nó giúp

Các vấn đề liên quan