2017-04-06 11 views
6

मैंने ऑनलाइन खोज की लेकिन इसके बारे में बहुत कम जानकारी है।आरटीएमपी अनुकूली बिटरेट एल्गोरिदम

मेरे पास एक लाइव प्रसारण ऐप है जहां मैं एक आरटीएमपी स्टैक पर एंड्रॉइड मीडियाकोडेक एसडीके का उपयोग कर कैमरे & माइक से उत्पन्न एन्कोडेड एच 264 वीडियो फ्रेम और एएसी ऑडियो भाग भेजता हूं।

मेरी लाइव स्ट्रीम 720p हैं और मेरा लक्ष्य 2500 केबीपीएस के साथ अच्छी गुणवत्ता के लिए है। यह स्पष्ट रूप से एक बहुत अच्छा नेटवर्क कनेक्शन की आवश्यकता है जिसका अर्थ है 4 जी यदि आप डेटा प्लान का उपयोग करते हैं।

समस्या सबसे बड़ी कनेक्शन के साथ भी कम चोटियों और भीड़ होगी, ऐसे में ऐसे क्षण होंगे जहां नेटवर्क इतनी भारी धारा नहीं रख सकता है। क्योंकि मैं उच्च विश्वसनीयता प्रदान करना चाहता हूं, मैं अपने ऐप पर स्वचालित अनुकूली बिटरेट शामिल करना चाहता हूं ताकि छवि की गुणवत्ता पक्ष या विश्वसनीयता में गिरा दी जा सके।

बात यह है कि - फ्रेम खोने के बिना नेटवर्क स्थितियों में इस स्वचालित अनुकूलन को कैसे प्राप्त किया जाए? क्या यह भी संभव है? मैंने पेशेवर एन्कोडिंग डिवाइस जैसे Cerevo का उपयोग किया है और वे कभी भी फ्रेम खो नहीं पाते हैं - हालांकि मेरे ऐप के साथ मुझे हमेशा नेटवर्क में पी-फ्रेम खोने के कारण कुछ भयानक खींच मिलती है।

private long adaptBitrate(long idleNanos, Frame frame) { 
     int bytes = frame.getSize(); 
     long nowNanos = System.nanoTime(); 
     if (nowNanos - mLastNanos > 1000L * 1000 * 1000) { 
      double idle = (double) idleNanos/(double) (nowNanos - mLastNanos); 
      float actualBitrate = newBitrate; 

      int size = mBuffer.size(); 
      String s = "Bitrate: " + actualBitrate/1000 
        + " kbps In-Flight:" + bytes 
        + " idle: " + idle; 
      if (size > MAX_BUF_SIZE && size > mLastSize) { 
       Log.i(TAG, "adaptBitrate: Dropping bitrate"); 
       newBitrate = (int) ((double) actualBitrate * BITRATE_DROP_MULTIPLIER); 
       if (newBitrate < MIN_BITRATE) { 
        newBitrate = MIN_BITRATE; 
       } 
       s += " late => " + newBitrate; 
       mRtmpHandler.requestBitrate(newBitrate); 
      } else if (size <= 2 && idle > IDLE_THRESHOLD) { 
       mIdleFrames++; 
       if(mIdleFrames >= MIN_IDLE_FRAMES){ 
        Log.i(TAG, "adaptBitrate: Raising bitrate"); 
        newBitrate = (int) ((double) newBitrate * BITRATE_RAISE_MULTIPLIER); 
        if (newBitrate > MAX_BITRATE) { 
         newBitrate = MAX_BITRATE; 
        } 
        s += " idle => " + newBitrate; 
        mRtmpHandler.requestBitrate(newBitrate); 
        mIdleFrames = 0; 
       } 
      } 
      debugThread(Log.VERBOSE, s); 
      mLastNanos = System.nanoTime(); 
      mLastSize = size; 
      idleNanos = 0; 
     } 
     return idleNanos; 
    } 

तो मेरी बफर एक सीमा से अधिक किया गया है, मैं बिटरेट कम:

यह मैं वर्तमान में क्या है। यदि मेरा ऐप एक नए फ्रेम की प्रतीक्षा में बहुत अधिक समय व्यतीत कर रहा है, तो लगातार कई फ्रेम के लिए, तो मैं बिटरेट बढ़ाता हूं।

इससे कोई फर्क नहीं पड़ता कि मैं थ्रेसहोल्ड मूल्यों के साथ कितना सतर्क हूं, मैं हमेशा महत्वपूर्ण जानकारी खो रहा हूं और अगली कीफ्रेम आने तक (2 सेकंड) तक मेरी स्ट्रीम टूट जाती है। कभी-कभी ऐसा लगता है कि नेटवर्क एक निश्चित बिटरेट (उदाहरण के लिए, 1500 केबीपीएस पर स्थिर) रख सकता है, लेकिन छवि में अभी भी कुछ खींचेंगी जैसे कि फ्रेम में खो गया था। अच्छी नेटवर्क स्थितियों के साथ, सब कुछ चिकनी है।

इन स्ट्रीमिंग डिवाइस इन स्थितियों को कैसे प्रबंधित करते हैं? यह हमेशा उनके साथ अच्छा लग रहा है, कोई ड्रैगिंग या फिसल गया फ्रेम नहीं ...

+0

तो क्या आप जानते हैं कि डिवाइस एन्कोडर वास्तव में मोड स्विचिंग का समर्थन करता है या नहीं? दूसरे शब्दों में, जब आप एक पूर्ण कनेक्शन पर एक स्विच अनुकरण करते हैं तो क्या होता है? साथ ही, क्या यह एक वास्तविक समय स्ट्रीमिंग परिदृश्य है, जैसे बातचीत, या बस आम तौर पर प्रसारण? – ThomasRS

+0

रीयल-टाइम प्रसारण। यदि आप बिटरेट को अपनाने का मतलब रखते हैं, तो आप "मोड स्विचिंग" से क्या मतलब रखते हैं, मैं आउटपुट बिटस्ट्रीम को मापता हूं और यह वांछित बिटरेट से मेल खाता है, इसलिए यह बिटरेट मध्यप्रदेश को प्रभावी ढंग से बदल रहा है। अगर मैं गलत नहीं हूं तो 4.3 से भी सभी डिवाइस इसका समर्थन करते हैं। –

उत्तर

0

वास्तव में ब्रॉडकास्टर पक्ष से अनुकूली बिटरेट के बारे में कोई जानकारी ऑनलाइन नहीं है, आश्चर्य की बात है। जब मुझे आरटीएसपी और दो आरटीपी सॉकेट के साथ ऐसा कुछ लागू करना पड़ा, तो मैंने एक समान दृष्टिकोण लिया, जो एक मतदान वर्ग बना रहा था जो पैकेट बफर> $ GOOD_PCT मुक्त होने पर मध्यस्थता के बिटरेट को मामूली रूप से बढ़ाएगा, कतार में आक्रामक रूप से इसे रोक देगा $ BAD_PCT से कम था, और यदि यह बीच में था तो कुछ भी नहीं करें। Partially seen here। मुझे यकीन नहीं है कि मेरे पास पोस्ट कोड के आधार पर आपके समाधान की पूरी तस्वीर है, लेकिन आप सीधे मेडियोडोडेक बिटरेट को एडजस्ट कर रहे हैं, सही? भ्रष्टाचार का एकमात्र समय था जब मैंने मेडिकोडेक से सिंक फ्रेम का अनुरोध किया था, इसलिए इससे बचें कि यह आपके कोड में है। उम्मीद है की यह मदद करेगा।

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