2011-10-23 18 views
14

बफर कर रहा है या नहीं, क्या किसी को पता है कि वीडियो व्यू बफरिंग कब होता है?पता लगाएं कि कोई वीडियोविव

जब मैं वीडियो बफरिंग करता हूं तो मैं प्रोग्रेसडिअलॉग दिखाना चाहता हूं।

अब तक मैंने ऑनपेरेड लिस्टनर का उपयोग करने का प्रयास किया है, लेकिन यह केवल तब काम करता है जब वीडियो पहले लोड होता है। यदि कोई वीडियो चल रहा है और उपयोगकर्ता स्क्रब बार को एक अलग बिंदु पर ले जाता है तो वीडियो अभी भी "तैयार" है, भले ही यह बफरिंग हो।

मैं भी कोशिश की (मैं जानता हूँ कि यह भयंकर है) एक AsyncThread कि isPlaying() पर सिर्फ व्यस्त प्रतीक्षा करता है:

private class BufferTask extends AsyncTask<Void, Void, Void> { 

    protected Void doInBackground(Void...voids) { 
    final VideoView videoView = (VideoView)findViewById(R.id.video); 
    while (!videoView.isPlaying()) { } 
    return null; 
    } 

protected void onPostExecute(Void v) { 
    // Hide the dialog here... 
} 
} 

इसका कारण यह है कि जैसे ही आप शुरू फोन काम नहीं करता है() एक VideoView करने लगता है बफरिंग होने के बावजूद खेलना माना जाता है।

एकमात्र समाधान जो मैं सोच सकता हूं एक कस्टम वीडियो व्यू प्रकार वर्ग बना रहा है, इसलिए मैं अपने मीडियाप्लेयर इंस्टेंस का उपयोग कर सकता हूं।

कोई विचार? पढ़ने के लिए धन्यवाद।

+1

क्या आपकी समस्या हल हो गई है? –

उत्तर

1

मैं कुछ इसी तरह काम कर रहा हूं, और एक महान समाधान के साथ नहीं आ सकता था। कुछ रोचक समाधान here पोस्ट किए गए थे कि आपको यह देखना चाहिए कि आपने उन्हें नहीं देखा है या नहीं।

वैसे भी, मैं निम्नलिखित हैक के साथ आया था जो उपरोक्त धागे में संकेत दिया गया था और अभी के लिए ठीक काम करता है।

@Override 
public void onBufferingUpdate(MediaPlayer mp, int percent) { 
    float temp = ((float)mp.getCurrentPosition()/(float)mp.getDuration())*100; 
    if(Math.abs(percent - temp) < 1) { 
     buffer_fail++; 
     if(buffer_fail == 15) { 
      //buffer failed 
     } 
    } 
} 
+0

इसका उपयोग किसी वीडियो व्यू के अंदर नहीं किया जा सकता है। – Rui

+2

तो MediaView.setOnPreparedListener –

9

कस्टम वीडियो व्यू को लागू नहीं करने के लिए मैं निम्नलिखित हैक के साथ आया था। विचार यह है कि यदि मौजूदा स्थिति 1 सेकंड पहले की तरह है तो प्रत्येक 1 सेकंड की जांच करें। यदि ऐसा है, तो वीडियो बफरिंग कर रहा है। यदि नहीं, तो वीडियो वास्तव में खेल रहा है।

final Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 
    public void run() { 
     int duration = videoView.getCurrentPosition(); 
     if (old_duration == duration && videoView.isPlaying()) { 
      videoMessage.setVisibility(View.VISIBLE); 
     } else { 
      videoMessage.setVisibility(View.GONE); 
     } 
     old_duration = duration; 

     handler.postDelayed(runnable, 1000); 
    } 
}; 
handler.postDelayed(runnable, 0); 

videoMessage केवल पाठ "बफरिंग ..." मेरी VideoView के केंद्र में रखा के साथ एक TextView है।

+3

से प्राप्त मीडियाप्लेयर के साथ इसका उपयोग करें यह कोड की रिकर्सिव घातीय-स्मृति-उपभोक्ता टुकड़ा जैसा दिखता है। यही है ना – Behnam

7

API level 17 के बाद से, आप अब InfoListener MediaPlayer से पहुँच सकते हैं:

final MediaPlayer.OnInfoListener onInfoToPlayStateListener = new MediaPlayer.OnInfoListener() { 

    @Override 
    public boolean onInfo(MediaPlayer mp, int what, int extra) { 
     switch (what) { 
      case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START: { 
       mProgressBar.setVisibility(View.GONE); 
       return true; 
      } 
      case MediaPlayer.MEDIA_INFO_BUFFERING_START: { 
       mProgressBar.setVisibility(View.VISIBLE); 
       return true; 
      } 
      case MediaPlayer.MEDIA_INFO_BUFFERING_END: { 
       mProgressBar.setVisibility(View.VISIBLE); 
       return true; 
      } 
     } 
     return false; 
    } 

}); 

mVideoView.setOnInfoListener(onInfoToPlayStateListener); 
+1

क्या हमें बफरिंग एंड पर प्रगति छिपाना नहीं चाहिए? –

4

के बाद कोड एक बफरिंग संवाद हर बार VideoView बफरिंग है दिखाएगा।

final ProgressDialog bufferingDialog; 
    bufferingDialog = ProgressDialog.show(context, 
      "Buffering", "Please wait", true, true); 

    VideoView videoView; 
    videoView = (VideoView) findViewById(R.id.video_view); 
    videoView.setVideoPath(path); 
    videoView.setMediaController(new MediaController(context)); 
    videoView.requestFocus(); 
    videoView.start(); 
    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      mp.setOnInfoListener(new MediaPlayer.OnInfoListener() { 
       @Override 
       public boolean onInfo(MediaPlayer mp, int what, int extra) { 
        if (what == MediaPlayer.MEDIA_INFO_BUFFERING_START) 
         bufferingDialog.show(); 
        if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END) 
         bufferingDialog.dismiss(); 
        return false; 
       } 
      }); 
     } 
    }); 
    videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { 
     @Override 
     public boolean onError(MediaPlayer mp, int what, int extra) { 
      bufferingDialog.dismiss(); 
      return false; 
     } 
    }); 
संबंधित मुद्दे