2013-07-24 9 views
8

नहीं कहा जाता है, मैं एक मध्यस्थ के ऑनइन्फोलेनर को सुनने की कोशिश कर रहा हूं जिसे मैंने बफरिंग शुरू होने और समाप्त होने के लिए बनाया है।OnInfoListener को कभी भी

किसी कारण से घटना कभी खत्म नहीं होती है।

यह मेरा आरंभ कर रहा है कोड

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

और ये मेरे श्रोता है

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

किसी कृपया मुझे समझ में क्यों हो रहा है मदद कर सकते हैं? धन्यवाद

+1

ही issu मदद करता है = ( –

+0

फ़ाइल खेलने के लिए स्थानीय है कोशिश कर रहे हैं है? – Desert

+0

नहीं, यह एक एचएलएस फ़ाइल स्ट्रीमिंग का है एक तृतीय पक्ष सर्वर से – orelzion

उत्तर

6

अच्छी तरह से यह एंड्रॉइड में एक ज्ञात बग है। एचएलएस स्ट्रीम खेलते समय यह कभी भी OnInfoListener या OnBuffering को कॉल नहीं करता है। अधिक जानकारी के

मेरे तथाकथित समाधान के लिए

देखो here बनाने के लिए एक धागा अब खिलाड़ी के पक्ष के साथ चलाता था, और समय-समय पर इसकी प्रगति की जाँच करके तय करें कि प्लेबैक बंद कर दिया है - यह सोचते हैं कि इसका मतलब है खिलाड़ी बफरिंग कर रहा है।

यहाँ मेरी कोड जिसे कभी यह चाहता है के लिए

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

आशा है कि यह मेरे लिए

संबंधित मुद्दे