2010-12-17 20 views
5

यह अधिकांशतः वास्तविकता प्रकार के अनुप्रयोगों के लिए प्रासंगिक है। एप्पल यहाँ AVCaptureSession साथ कैसे वीडियो फ्रेम पर कब्जा करने (और उन्हें छवियों के रूप में बचाने के लिए अगर जरूरत हो) के बारे में जानकारी प्रदान करता है:वीडियो पर ओपनजीएल व्यू ओवरले करने के लिए कैप्चर किए गए वीडियो फ्रेम से ओपनजीएल बनावट बनाने के विकल्प? (आईफोन)

http://developer.apple.com/library/ios/#qa/qa2010/qa1702.html

मुझे पता है कि यह एक पर कब्जा कर लिया वीडियो फ्रेम एक ओपन बनावट बाहर बनाने और उसके बाद के लिए संभव है ओपनजीएल दृश्य में पृष्ठभूमि के रूप में इसका उपयोग करें जिस पर अन्य ग्राफिक्स को ओवरले करना है।

मुझे आश्चर्य है कि इस विधि के कोई विकल्प हैं या नहीं? ऊपर वर्णित विधि सबसे अच्छी हो सकती है (मुझे नहीं पता कि यह है) लेकिन यदि कोशिश करने के विकल्प हैं तो जानना अच्छा होगा। उदाहरण के लिए, क्या AVCaptureVideoPreviewLayer पर ओपनजीएल व्यू को ओवरले करने का कोई तरीका है?

उत्तर

6

आप वास्तव में AVCaptureVideoPreviewLayer जैसे कुछ पर OpenGL सामग्री ले सकते हैं, लेकिन आपका प्रदर्शन भुगतना होगा। ऐप्पल अत्यधिक अनुशंसा करता है कि आप अन्य प्रदर्शन तत्वों के शीर्ष पर गैर-ओपेक ओपनजीएल ES सामग्री ओवरले न करें। OpenGL ES Programming Guide for iOS से:

निरपेक्ष सर्वश्रेष्ठ प्रदर्शन के लिए, आपके आवेदन अपनी सामग्री प्रस्तुत करने के लिए पर OpenGL ES भरोसा करना चाहिए। पर ऐसा करने के लिए, CAEAGLLayer ऑब्जेक्ट को स्क्रीन से मिलान करने के लिए उस दृश्य को आकार दें, इसकी अपारदर्शी संपत्ति YES पर सेट करें, और सुनिश्चित करें कि कोई अन्य कोर एनीमेशन परत या दृश्य दिखाई दे रहे हैं। यदि आपकी ओपनजीएल ईएस परत अन्य परतों के शीर्ष पर संमिश्रित है, तो CAEAGLLayer ऑब्जेक्ट अपारदर्शी कम कर देता है लेकिन प्रदर्शन लागत को समाप्त नहीं करता है।

अपने CAEAGLLayer वस्तु परत पदानुक्रम में इसे नीचे परतों के शीर्ष पर मिश्रित किया जाता है, तो renderbuffer के रंग डेटा एक premultiplied अल्फा प्रारूप में होना चाहिए कोर एनिमेशन द्वारा सही ढंग से सम्मिश्रित किया जाना है। अन्य सामग्री के शीर्ष पर ओपनजीएल ES सामग्री को गंभीर प्रदर्शन जुर्माना है।

ईमानदारी से, वीडियो में एक बनावट के रूप में खींचना मुश्किल नहीं है और फिर इसे अपने 3-डी ओवरले के पीछे बिलबोर्ड के रूप में प्रदर्शित करना मुश्किल नहीं है। मेरा नमूना आवेदन here स्क्रीन पर प्रदर्शित करने के लिए एक ओपनजीएल ईएस (2.0) बनावट में कैमरा वीडियो के पासथ्रू करता है। केवल कुछ संशोधनों के साथ, आप इसके शीर्ष पर 3-डी सामग्री रख सकते हैं। AVCaptureVideoPreviewLayer के शीर्ष पर गैर-अपारदर्शी 3-डी सामग्री को आकर्षित करने की कोशिश करने से यह आपको बेहतर प्रदर्शन प्रदान करेगा।

हालांकि, यदि आप ओपनजीएल ES सामग्री पर सरल स्थिर UIViews प्रदर्शित करना चाहते हैं, तो इसे बिना किसी प्रदर्शन दंड (~ मेरे अनुभव में फ्रेमरेट में ~ 5% की कमी) के बिना किया जा सकता है।

+0

धन्यवाद। मुझे वीडियो में एक बनावट के रूप में खींचने में कोई समस्या नहीं थी, लेकिन मुझे यकीन नहीं था कि कौन सी तकनीक सर्वश्रेष्ठ प्रदर्शन (निर्माण/बनावट बनाम बनावट बनाकर) उत्पन्न करेगी। ऐप्पल के दस्तावेज़ और आपके स्वयं के कोड के लिए आपके लिंक बहुत उपयोगी हैं। मैं कुछ ऐसा कर रहा हूं जो आपके कोड के समान है और इसमें से अधिकतर जगह है। धन्यवाद। –

+0

~ फ्रेम दर में 5% की कमी! –

+0

@BradLarson क्या कोई प्रदर्शन समस्या है यदि हम OpenGL ES सामग्री के शीर्ष पर AVCaptureVideoPreviewLayer डालते हैं? – onmyway133

1

निश्चित रूप से, सामग्री के बावजूद विचारों को एक साथ स्तरित किया जा सकता है। वीडियो पर लेयरिंग जीएल 2 डी से 2 डी लेयरिंग से अलग नहीं है।

बस एकमात्र पकड़ यह है कि आपको अपनी जीएल सामग्री प्रस्तुत करने की आवश्यकता है ताकि उत्पादित छवि अल्फा द्वारा प्रीमिलीप्लाइड हो (जैसे आईओएस पर अन्य सभी पारदर्शी सामग्री प्रीमिलीप्लाइड हो)।

+0

धन्यवाद।मैंने शुरुआत में सबकुछ पूर्ववत करने पर विचार नहीं किया। –

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