2015-05-29 8 views
5

मुझे पता है कि इस सवाल से पहले पूछा गया है, हालांकि, मैं काम करने वाले किसी भी समाधान को खोजने में असमर्थ हूं।नेक्सस 6 फ्रंट कैमरा ऊपर

Nexus 6 फ्रंट कैमरा हमेशा मेरे ऐप में उल्टा दिखाता है। कुछ समाधान "setDisplayOrientation" का उपयोग करना है, जो स्क्रीन पर कैमरे को फ्लिप करता है। हालांकि, हम onPreviewFrame से प्राप्त frames के साथ वीडियो को एन्कोड करते हैं।

Android SDK Documentation के अनुसार, setDisplayOrientation वास्तव में byte[]onPreviewFrame में नहीं बदलता है।

यह प्रीव्यूफ्रेम (बाइट [], कैमरा), जेपीईजी चित्र, या रिकॉर्ड किए गए वीडियो पर पारित बाइट सरणी के क्रम को प्रभावित नहीं करता है। पूर्वावलोकन के दौरान इस विधि को कॉल करने की अनुमति नहीं है।

यदि यह correct orientation में Nexus 6 सामने का कैमरा onPreviewFrame फ्रेम पाने के लिए संभव नहीं है, क्या fastest तरह से प्रत्येक फ्रेम फ्लिप करने, एफपीएस में एक बूंद पीड़ित के बिना है।

धन्यवाद!

+0

क्या आप अपना कोड दिखा सकते हैं? – Raptor

+0

मैं नहीं कर सकता .. कैमरा गतिविधि में कुछ 1000 लाइनें हैं जिन्हें मुझे जाने की आवश्यकता होगी। हालांकि इसके बारे में वास्तव में कुछ खास नहीं है। मूल कैमरा एपीआई (कैमरा 2 नहीं) का उपयोग कर फ्रंट कैमरा पर 720 पी का पूर्वावलोकन आकार सेट करना। नेक्सस 6 पर फ्रंट कैमरा एकमात्र फोन है जिसे हमने देखा है। एक त्वरित Google खोज से पता चलता है कि यह नेक्सस 6 बग है। यहां तक ​​कि इंस्टाग्राम और स्नैपचैट को इस मुद्दे पर कुछ बिंदु था (हालांकि वे इसे ठीक कर चुके हैं)। मुझे संदेह है कि उन्हें ऑनव्यूफ्रेम से कच्चे फ्रेम की आवश्यकता है। – tylerjroach

+0

मैं कल नेक्सस 6 की पकड़ पाने की कोशिश करूंगा और इस मुद्दे के साथ एक छीन लिया कैमरा ऐप बनाउंगा। यह एक बड़ी प्राथमिकता रही है क्योंकि हाल ही में एक सेलिब्रिटी ने ऐप का उपयोग किया था और .. निश्चित रूप से उसके पास नेक्सस 6 था। – tylerjroach

उत्तर

2

मैं इसे हल करने में सक्षम था और फ्रेम को फ़्लिप करने के लिए खुले सीवी का उपयोग कर एफपीएस उच्च रखता था।

yuvimage = opencv_core.IplImage.create(frame.getWith/2, frame.getHeight/2 * 3/2, IPL_DEPTH_8U, 1); 
yuvimage.getByteBuffer().clear(); 
yuvimage.getByteBuffer().put(halveYUV420(frame.getData(), frame.getWidth(), frame.getHeight())); 
rgbimage = opencv_core.IplImage.create(frame.getWidth/2, frame.getHeight/2, IPL_DEPTH_8U, 3); 
rgbimage.getByteBuffer().clear(); 
opencv_imgproc.cvCvtColor(yuvimage, rgbimage, opencv_imgproc.CV_YUV2BGR_NV21); 
opencv_core.cvFlip(rgbimage, rgbimage, 0); 
+0

क्या आपने केवल नेक्सस 6 के लिए यह परिवर्तन किया है, या किसी अन्य डिवाइस को यह समस्या है? –

3

कोड स्निपेट Camera.setDisplayOrientation() के तहत मेरे लिए यह समस्या हल हो। आपको इसे आजमाने की ज़रूरत है।

+0

दुर्भाग्य से यह विधि पूर्वावलोकन पूर्वावलोकन में प्राप्त पूर्वावलोकन फ्रेम के लिए काम नहीं करती है। "यह ऑनव्यूफ्रेम (बाइट [], कैमरा), जेपीईजी चित्र, या रिकॉर्ड किए गए वीडियो में पास बाइट सरणी के क्रम को प्रभावित नहीं करता है। इस विधि को पूर्वावलोकन के दौरान बुलाया जाने की अनुमति नहीं है।" मैं इसे उपरोक्त मेरे समाधान के साथ काम करने में सक्षम था। आपके सहयोग के लिए धन्यवाद! – tylerjroach

0

सबसे तेज़ तरीका GPU के अंदर फ़्लिपिंग करना सबसे तेज़ तरीका होगा। GLSurfaceView पर कैमरा पूर्वावलोकन प्रस्तुत करें और छवि को ऊपर की ओर फ़्लिप करने के लिए वर्टेक्स शेडर्स का उपयोग करें। फिर, वर्तमान फ्रेम के बाइट प्राप्त करने के लिए glReadPixels का उपयोग करें। मुझे अन्य फोन पर glReadPixels के प्रदर्शन के बारे में निश्चित नहीं है, लेकिन यह Nexus 6/5 में बहुत तेज़ होना चाहिए।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। यह एक वैध समाधान की तरह दिखता है, हालांकि, मैंने जावासीवी के साथ अपने उत्तर में समस्या को ठीक कर दिया है (एफपीएस पर हिट किए बिना)। यह लाइब्रेरी पहले से ही वीडियो प्रसंस्करण के लिए उपयोग की जा रही थी। आपके समाधान के लिए धन्यवाद! – tylerjroach

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