2017-02-27 8 views
7

कृपया मेरी मदद करो:H.264 वीडियो एन्कोड करने के लिए MediaCodec के लिए औसत + अधिकतम बिटरेट कैसे सेट करें?

मैं एन्कोड करने के लिए कैमरे से H.264 वीडियो MediaCodec उपयोग कर रहा हूँ, समस्या है, जब मैं अपने फोन ले जाते हैं, उत्पादन वीडियो की गुणवत्ता, बहुत पूल है में मोज़ेक/दृश्य ब्लॉक से भरा वीडियो।

मेरे एनकोडर बिटरेट 500 केबीपीएस है, और बिटरेट मोड BITRATE_MODE_VBR है:

Belows कुछ विवरण हैं।

मैं बिटरेट को 800 केबीपीएस में बदलने की कोशिश करता हूं, आउटपुट वीडियो की गुणवत्ता बहुत सुधारती है, और यदि मैं बिट्रेट-मोड को BITRATE_MODE_CQ में बदलता हूं, तो आउटपुट वीडियो की गुणवत्ता सही होती है, लेकिन बिटरेट 1400 केबीपीएस तक बढ़ जाएगा।

मैं औसत बिटरेट को निम्न स्तर पर रखना चाहता हूं, उदा। 500 केबीपीएस, लेकिन जब फोन चल रहा है तो बिटरेट कुछ बड़े बिटरेट में फट गया, उदाहरण के लिए 800 केबीपीएस आईओएस वीडियोटूलबॉक्स में, औसत बिटरेट और अधिकतम बिटरेट सेट करने के लिए एक एपीआई केवीटीसीओप्रेशनप्रॉपर्टीकी डेपेटाटाइटलिमिट्स है, लेकिन एंड्रॉइड में, मैं उस औसत-अधिकतम बिटरेट नियंत्रण को कैसे प्राप्त कर सकता हूं?

मैंने देखा कि मीडियाकोडेक को कॉन्फ़िगर करते समय "अधिकतम-बिटरेट" पैरामीटर छिपा हुआ है, लेकिन इसका कोई प्रभाव नहीं है (क्योंकि एंड्रॉइड फ्रेमवर्क इस पैरामीटर को अनदेखा करता है, http://androidxref.com/7.1.1_r6/xref/frameworks/av/media/libstagefright/ACodec.cpp#configureCodec देखें), मैंने यह भी देखा कि एक छिपी हुई "गुणवत्ता" पैरामीटर, लेकिन इसका कोई प्रभाव नहीं पड़ता है।

कृपया मेरी मदद करें, धन्यवाद !!!

उत्तर

0

एंड्रॉइड स्रोतकोड से, ऐसा लगता है कि KEY_MAX_BIT_RATE अधिकतम बिट दर निर्धारित करेगा। से media/java/android/media/MediaCodecInfo.java

private static boolean supportsBitrate(
       Range<Integer> bitrateRange, MediaFormat format) { 
      Map<String, Object> map = format.getMap(); 

      // consider max bitrate over average bitrate for support 
      Integer maxBitrate = (Integer)map.get(MediaFormat.KEY_MAX_BIT_RATE); 
      Integer bitrate = (Integer)map.get(MediaFormat.KEY_BIT_RATE); 
      if (bitrate == null) { 
       bitrate = maxBitrate; 
      } else if (maxBitrate != null) { 
       bitrate = Math.max(bitrate, maxBitrate); 
      } 

      if (bitrate != null && bitrate > 0) { 
       return bitrateRange.contains(bitrate); 
      } 

      return true; 
     } 

स्नैपशॉट नीचे देखें मुझे पता है अगर यह आपके लिए काम करता है।

मैं आपको वीडियो रिज़ॉल्यूशन के आधार पर उच्च मूल्य डालने का सुझाव दूंगा। उदाहरण के लिए 1080p वीडियो 500 केबीपीएस वीबीआर या सीबीआर पर अच्छा नहीं लगेगा।

+0

मैंने 'KEY_MAX_BIT_RATE' पैरामीटर की कोशिश की है, वास्तव में कुंजी" अधिकतम-बिटरेट "है, लेकिन इसका वीबीआर में कोई प्रभाव नहीं पड़ता है, और ऐसा लगता है कि मूल कोड द्वारा पैरामीटर को त्याग दिया गया है, http://androidxref.com देखें /7.1.1_r6/xref/frameworks/av/media/libstagefright/ACodec.cpp#configureCodec। जब मैं 720 पी वीडियो एन्कोड करता हूं, तो मैं बिटरेट को 800 केबीपीएस के रूप में सेट करता हूं, जब मैं कैमरे के चारों ओर घूमता हूं, आउटपुट वीडियो की गुणवत्ता बहुत खराब होती है, ब्लॉक से भरा होता है, मैं चाहता हूं कि इनपुट डेटा बढ़ने पर मीडियाकोडेक अस्थायी रूप से बिटरेट को बढ़ाए, और इनपुट डेटा कम होने पर बिटरेट को औसत स्तर तक घटाएं, ऑटो। मैं यह कैसे कर सकता हूं? – Piasy

+0

वीडियो चिपसेट विलंबता का स्रोत है। आप इसे बहुत अधिक डेल्टा करने के लिए कह रहे हैं। –

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