2012-06-22 28 views
9

मेरे मूल धागे में मेरे पास एफएफएमपीईजी फ्रेम प्राप्त करने और डीकोडिंग करने के बाद उन्हें कतार में डाल दिया गया है।क्या AndroidBitmap_xxx फ़ंक्शंस का उपयोग करने से कहीं अधिक तेज़ वीडियो रेंडरिंग समाधान है?

जावा पक्ष पर मेरे पास GLSurfaceView है और Renderer.onDrawFrame से मैं बिटमैप पास करने वाले मूल कोड में कॉल कर रहा हूं (कि बिटमैप मैं केवल एक बार बनाता हूं, फिर इसे हर बार पास करता हूं)।

देशी कोड में मुझे कतार का सिर मिलता है, AndroidBitmap_xxx फ़ंक्शंस का उपयोग करके जावा बिटमैप में डेटा कॉपी करें, फिर उस बनाम जावा पर एक बिटचर को प्रस्तुत करें।

मुझे आश्चर्य है कि वीडियो प्रस्तुत करने का एक तेज़ तरीका है? क्या मैं इसे पूरी तरह देशी कोड में करूँगा, यदि हां, तो यह तेज़ क्यों होगा?

संपादित करें: मैं अब बंद कर दिया बिटमैप पिक्सेल आरजीबी फ्रेम पिक्सल नकल नहीं है, बल्कि मैं बंद कर दिया बिटमैप पिक्सल में सीधे YUV फ्रेम डिकोड। यह प्रतिपादन को काफी तेज बनाता है (क्योंकि अब कोई अनियंत्रित memcpy नहीं) अभी भी सवाल बनी हुई है।

+0

क्या फ़्यूचर डेटा के रूप में सीधे FFMpegs फ्रेम आउटपुट का उपयोग करने और इंटरमीडिएट बिटमैप चरण के बिना इसे अपलोड करने का कोई तरीका है? –

+0

मैं एंड्रॉइड में एफएफएमपीईजी का उपयोग कैसे कर सकता हूं ?? क्या आप मुझे कोई संदर्भ दे सकते हैं ?? मैं वास्तव में बिटमैप फ्रेम का उपयोग कर एक वीडियो प्रस्तुत करना चाहता था। –

उत्तर

2

बनावट में पिक्सल को बदलने की सबसे प्रभावी तकनीक को रेंडर-टू-बनावट कहा जाता है और इसे FBOs के माध्यम से ओपनजीएल/ओपनजीएल ईएस में किया जा सकता है। डेस्कटॉप ओपनजीएल पर आप सीधे जीपीयू पर पिक्सेल डेटा में हेरफेर करने के लिए पिक्सेल बफर ऑब्जेक्ट्स (PBOs) का उपयोग कर सकते हैं (लेकिन ओपनजीएल ईएस अभी तक इसका समर्थन नहीं करता है)।

अनदेखा ओपनजीएल पर आप सिस्टम मेमोरी में पिक्सल बदल सकते हैं और फिर glTexImage2D/glTexSubImage2D के साथ बनावट अपडेट कर सकते हैं - लेकिन यह अक्षम अंतिम उपाय समाधान है और यदि संभव हो तो इससे बचा जाना चाहिए। glTexSubImage2D आमतौर पर बहुत तेज़ होता है क्योंकि यह केवल मौजूदा बनावट के अंदर पिक्सेल अपडेट करता है, जबकि glTexImage2D पूरी तरह से नया बनावट बनाता है (एक लाभ के रूप में आप बनावट के आकार और पिक्सेल प्रारूप को बदल सकते हैं)। दूसरी ओर, glTexSubImage2D बनावट के केवल हिस्सों को अद्यतन करने की अनुमति देता है।

आप कहते हैं कि आप इसे OpenGL ES साथ काम करना चाहते, तो मैं निम्न चरणों का प्रस्ताव होगा:

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

FBOs के लिए कोड इस तरह देख सकते हैं:

// setup FBO 
glGenFramebuffers(1, &FFrameBuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, FFrameBuffer); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, YourTextureID, 0); 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

// render to FBO 
glBindFramebuffer(GL_FRAMEBUFFER, FFrameBuffer); 
glViewport(0, 0, YourTextureWidth, YourTextureHeight); 
your rendering code goes here - it will draw directly into the texture 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

// cleanup 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 
glDeleteFramebuffers(1, &FFrameBuffer); 

ध्यान रखें कि सभी पिक्सेल प्रारूपों के लिए प्रदान की जा सकती है नहीं रखें। आरजीबी/आरजीबीए आमतौर पर ठीक है।

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

  • कोई संबंधित समस्या नहीं^_^