2012-10-14 12 views
8

इस निम्नलिखित स्रोत कोड का टुकड़ा दिया जाता है:एंड्रॉयड VideoView MediaPlayer OnInfoListener - घटनाओं नहीं निकाल

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

मैं एचएलएस स्ट्रीमिंग रहा एंड्रॉयड 3.x + उपकरणों और एक लोड हो रहा है संवाद को छिपाने के लिए एक बार बफरिंग पूरा हो गया है की कोशिश कर के साथ धाराओं। वीडियो स्ट्रीमिंग काम करता है, लेकिन जानकारी घटनाओं को कभी नहीं निकाल दिया जाता है।

कोई भी विचार?

+0

किसी को भी इस के लिए एक अच्छा समाधान प्रदान कर सकते हैं? –

+0

मैं बस में 'OnInfoListener' स्थापित करने के लिए कि क्या सोच रहा हूँ' onPrepared (...) 'बस कॉल की श्रृंखला में बहुत देर हो चुकी है। 'PrepareAsync()' पर प्रलेखन निम्नलिखित कहते हैं: * "(...) धाराओं के लिए, आप prepareAsync() है, जो तुरंत वापस लौट, बुलाना चाहिए ** बजाय अवरुद्ध जब तक पर्याप्त डेटा बफ़र कर दिया गया है **।" * यही कारण है कि मुझे लगता है जैसे 'ऑनपेरेड (...)' तब तक हिट नहीं होगा जब तक कि बफर पहले ही भर चुके नहीं हैं। कोई भी बदलाव जो आपने पहले से ही प्रतिबिंब दिया है? आपको किसी भी समय 'OnInfoListener' सेट करने की अनुमति देनी चाहिए। –

उत्तर

0

आप वीडियो व्यू पर ऑनपेरेड लिस्टनर सेट करने में सक्षम हो सकते हैं क्योंकि यह आपकी ऑब्जेक्ट है लेकिन यदि आप VideoView के चेकआउट स्रोत को देखते हैं तो आप पाएंगे कि एमएमडियाप्लेयर इसका निजी सदस्य है, इसलिए बाहरी से आप जो भी परिवर्तन करते हैं, उसे लागू नहीं किया जाएगा।

आपकी आवश्यकता के अनुसार आप बफरिंग स्थिति की जरूरत है ताकि आप धागे या हैंडलर या कुछ बात कर सकते हैं तो आप बफर स्थिति एक विधि

int percent = videoView.getBufferPercentage(); 

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

इनाम नोट में एक पढ़ा, यह नहीं है कि वह क्या चाहते हैं: _ "मैं नहीं चाहता कि एक समाधान चाहते हैं * कि चुनाव खेलने सिर को देखने के लिए प्रगति * onBufferUpdate अनुमान लगाने के लिए उपयोग करता है की जांच करने के (आधारित पुराने पर पोस्ट पर तो यह सटीक नहीं है। "_ – yorkw

+0

कृपया पहले पैरा –

+0

@yorkw में मैंने जो कहा है, उसे जांचें। यदि आप videoview के लिए एओएसपी स्रोत देखते हैं, तो GetBufferPercentage उसी बफर को अद्यतन करता है जैसे BufferUpdate (प्रतिशत) करता है। BufferUpdate आपको बताता है कि कितना सामग्री ने पूरे वीडियो के संबंध में buffered किया है। उदाहरण के लिए 80% का मतलब है, 80% वीडियो buffered –

0

आप setOnInfoListener माध्यम से जाने की कोई जरूरत नहीं है पाने के लिए अपने यूआई अद्यतन कर सकते हैं

ओवरऑर्डिंग सेटऑनपेरेड लिस्टनर विधि पर्याप्त है। एपीआई में के रूप में दिखाने

सार्वजनिक शून्य setOnPreparedListener (MediaPlayer.OnPreparedListener एल)

रजिस्टर एक कॉलबैक जब मीडिया फ़ाइल लोड किया जाता है लागू किया जा करने के लिए और जाने के लिए तैयार।

हां, तो आप खारिज कर सकते हैं setOnPreparedListener विधि के अंदर अपने संवाद पर्याप्त

इस

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

यह काम नहीं करेगा @ क्रिस्टियन की पोस्ट –

+0

मेरे परिणाम और उसके परिणाम के बीच क्या अलग है? यह भी लोड होता है जब यह लोड होता है बफर पूरा हो गया है। मैं इसे एंड्रॉयड एपीआई से नकल। इसे यहाँ http://developer.android.com/reference/android/widget/VideoView.html#setOn देखें PreparedListener (android.media.MediaPlayer.OnPreparedListener) यह मेरे इस सवाल का जवाब मैं @Cristian दिया दोहराना चलो –

+0

। यह ऐसा कुछ है जिसे मैंने पहले ही कोशिश की है। मैं बफर अंडर्रंस के लिए खाता खोलने की कोशिश कर रहा हूं जो संभवत: आरंभिक बफर, खराब नेटवर्क स्थितियों या मांग के कारण rebuffers के कारण कारणों के कारण हुआ। आपकी विधि उन परिदृश्यों में से किसी के लिए काम नहीं करेगी। –

1

onPrepared जब MediaPlayer बफरिंग शुरू करने के लिए तैयार है कहा जाता है की तरह है, जब वीडियो पूरी तरह से बफ़र नहीं । हालांकि, onPrepared विधि के भीतर से लोडिंग संवाद को खारिज करना पूरी तरह से स्वाभाविक है।

इसके अलावा MEDIA_INFO_BUFFERING_ENDप्रयोग किया जाता है जब MediaPlayer बफ़र्स भरने के बाद प्लेबैक शुरू करने है, इसलिए मुझे नहीं लगता कि यह संवाद निरस्त करने के लिए उपयोग करने के लिए कुछ किया जाना चाहिए। तो यह काम करना चाहिए:

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

यह ऐसा कुछ है जिसे मैंने पहले ही कोशिश की है। मैं बफर अंडर्रंस के लिए खाता खोलने की कोशिश कर रहा हूं जो संभवत: आरंभिक बफर, खराब नेटवर्क स्थितियों या मांग के कारण rebuffers के कारण कारणों के कारण हुआ। आपकी विधि उन परिदृश्यों में से किसी के लिए काम नहीं करेगी। वीडियो शुरू होने के बाद –

2

आप सही हैं, घटनाओं को कभी नहीं निकाल दिया जाता है। यह एक ज्ञात एचएलएस बग है जो मुझे नहीं लगता कि Google ठीक करेगा।

यह ऑनइन्फो और बफरिंग घटनाओं पर लागू होता है।

https://code.google.com/p/android/issues/detail?id=42767 और https://code.google.com/p/googletv-issues/issues/detail?id=2

क्षमा मिलते हैं!

2

ओपी क्या पूछ रहा है, इस बारे में पूरी तरह से यकीन नहीं है, लेकिन जानकारी के कुछ बहुत ही असामयिक बिट्स हैं।

मैं आगे बढ़ने पर भरोसा नहीं करता। मुझे अविश्वसनीय लगता है।

मुझे मीडियाप्लेयर के माध्यम से एचएलएस स्ट्रीमिंग के लिए जानकारी के दो सबसे उपयोगी टुकड़े मिल गए हैं वीडियो की अवधि और वीडियो की प्रगति की स्थिति। आप प्रगति अद्यतनों को सुनकर इन दोनों को प्राप्त करते हैं।

जब अवधि शून्य से अधिक हो, तो आप जानते हैं कि वीडियो वास्तव में तैयार है और इसे कुशलतापूर्वक (स्क्रब) किया जा सकता है। जब प्रगति की स्थिति बदलती है, तो आप जानते हैं कि वीडियो बफरिंग किया गया है और प्लेबैक शुरू किया है। यह अंतिम आइटम केवल तभी काम करता है जब वीडियो निश्चित रूप से खेल रहा हो। MediaPlayer गलत जानकारी रिले करने के लिए जाता है।

जानकारी के ये टुकड़े अधिकतर सटीक होते हैं और आमतौर पर समय पर "काफी" होने पर भरोसा किया जा सकता है। यह समयबद्धता उपकरण से डिवाइस में भिन्न होती है।

0

आप हर बार यह बफरिंग (प्रारंभिक समय या बाद के बफर underruns) है लोड हो रहा है दिखाने के लिए चाहते हैं, बस इसे फिर से दिखाने के लिए सुनिश्चित:

// 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": 
    } 
} 

तो इस घटना के अनुक्रम के रूप में वांछित करना होगा:

- 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) 

अद्यतन:

यह जानकारी घटनाओं काम संभालने है। बेशक।

2

मैं बहुत देर में पता है, लेकिन यह उपयोगकर्ताओं को अब भी समाधान के लिए मांग के लिए पोस्टिंग (यह मेरे लिए काम किया):

 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 निकाल दिया जाता है। फिर हम वीडियो के मध्यवर्ती बफरिंग के दौरान प्रगति-बार को दिखाने और छिपाने के लिए इसका उपयोग कर सकते हैं। –

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