2015-03-25 3 views
9

मैं चित्रों के विस्फोट को पकड़ने के लिए एंड्रॉइड-कैमरा 2 बेसिक कोड को संशोधित करने की कोशिश कर रहा हूं। हालांकि, मुझे अपने नेक्सस 5 पर 200-300ms से अधिक तेज चित्रों के बीच देरी नहीं मिल सकती है, एल 5.0.1 चला रहा है।एंड्रॉइड कैमरा 2 कैप्चर विस्फोट बहुत धीमा है

मैंने चीजों का एक गुच्छा करने की कोशिश की है, लेकिन यह सबसे बुनियादी है। यह कैमरा 2 बेसिक कोड का एकमात्र हिस्सा है जिसे मैंने संशोधित किया है। मेरा पूर्वावलोकन TextureView केवल 50x50dp है, लेकिन इससे कोई फर्क नहीं पड़ता, है ना?

इसके लायक होने के लिए, इस कोड में केवल मेरे नेक्सस 6 पर एलआई 5.1 के साथ लगभग 50-100ms देरी हुई है।

private void captureStillPicture() { 
    try { 
     List<CaptureRequest> captureList = new ArrayList<CaptureRequest>(); 
     mPreviewRequestBuilder.addTarget(mImageReader.getSurface()); 

     for (int i=0;i<10;i++) { 
      captureList.add(mPreviewRequestBuilder.build()); 
     } 

     mCaptureSession.stopRepeating(); 
     mCaptureSession.captureBurst(captureList, cameraCaptureCallback, null); 
     mPreviewRequestBuilder.removeTarget(mImageReader.getSurface()); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

CameraCaptureSession.CaptureCallback cameraCaptureCallback = new CameraCaptureSession.CaptureCallback() { 
    @Override 
    public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, 
      TotalCaptureResult result) { 
     Log.d("camera","saved"); 
     mPictureCounter++; 
     if (mPictureCounter >= 10) 
      unlockFocus(); 
    } 
}; 
+0

एशेरॉनकैप्टन क्या आप कृपया एक कोड संलग्न कर सकते हैं कि आपने विस्फोट मोड को कैसे कार्यान्वित किया? – user0770

उत्तर

14

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

उद्धृत किया गया 30fps दर ImageReader पर आउटपुट छवि प्रारूप को YUV के रूप में सेट करके हासिल किया जा सकता है, क्योंकि यह कैमरे के लिए एक अधिक "मूल" आउटपुट है। छवियों को कैप्चर करने के तरीके को स्टोर करने का यह तरीका होगा, और उसके बाद आपको कैमरे की इनलाइन प्रोसेसिंग से अलग जेपीईजी एन्कोडिंग करना होगा।

उदाहरण के लिए, नेक्सस 5 पर आउटपुट स्टॉल टाइम JPEG एन्कोडिंग 243ms है, जिसे आप देख रहे हैं। YUV_420_888 आउटपुट के लिए, यह 0ms है। इसी प्रकार, उनके बड़े आकार की वजह से, RAW_SENSOR एन्कोडिंग 200ms का स्टाल टाइम पेश करती है।

यह भी ध्यान दें कि यदि आप "तेज" प्रारूप चुनकर स्टाल टाइम बाधा को हटाते हैं, तो आउटपुट छवि आकार के आधार पर अभी भी न्यूनतम फ्रेम समय है। लेकिन नेक्सस 5 के पूर्ण रिज़ॉल्यूशन आउटपुट के लिए, यह 33 एमएमएस है, जो आप उम्मीद कर रहे थे।

प्रासंगिक जानकारी कैमरा मेटाडेटा StreamConfigurationMap ऑब्जेक्ट, here में है। पुष्टिकरण के लिए getOutputStallDuration(int format, Size size) और getOutputMinFrameDuration(int format, Size size) विधियां देखें।

+1

YUV_420_888 निश्चित रूप से यह किया। सहायता के लिए धन्यवाद! – acheroncaptain

+0

दरअसल, कुछ उपकरणों पर जेपीईजी प्रारूप वाईयूवी (या रॉ) से तेज हो सकता है। यह जेपीईजी एन्कोडर के फर्मवेयर कार्यान्वयन पर निर्भर करता है, उदा। [डीएम 3730] (https://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/537/t/431683) जेपीजी प्रारूप स्ट्रीमिंग का समर्थन करता है। स्नैपड्रैगन 810 15 एफपीएस [सबूत] पर 16 मेगापिक्सल जेपीईजी विस्फोट शॉट्स का उत्पादन कर सकता है (https://www.qualcomm.com/media/documents/files/whitepaper-breakthrough-mobile-imaging-experiences.pdf): पर्याप्त नहीं है रॉ या वाईयूवी के लिए बैंडविड्थ। –

-2

इस PCMag लेख के आधार पर: http://www.pcmag.com/article2/0,2817,2428017,00.asp नेक्सस 5 फट मोड आप प्रति सेकंड 3 चित्र लेने की सुविधा देता है। तो तस्वीरों के बीच 333ms से कम प्राप्त करना बेहद असंभव है।

क्या आपके पास जानकारी के लिए कोई स्रोत है जो बताता है कि नेक्सस 5 विस्फोट तेजी से होना चाहिए? कब्जा अनुरोध के बाद स्थापित करने के लिए

+1

यह कैमरा 2 एपीआई के लिए है। एक पूर्ण सक्षम डिवाइस के साथ 30 एफपीएस संभव होना चाहिए। http://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#INFO_SUPPORTED_HARDWARE_LEVEL – acheroncaptain

+1

इसके अलावा, यह प्रश्न देखें: http: // stackoverflow।कॉम/प्रश्न/285668 9 8/एंड्रॉइड-कैमरा 2-स्पीड-अप – acheroncaptain

+0

@acheroncaptain तो आपने पुष्टि की है कि android.request.availableCapabilities में आपके N5 पर BURST_CAPTURE शामिल है? – iheanyi

5

कोशिश पैरामीटर

requestBuilder = camDevice 
     .createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 

requestBuilder.set(CaptureRequest.EDGE_MODE, 
     CaptureRequest.EDGE_MODE_OFF); 
requestBuilder.set(
     CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE, 
     CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE_ON); 
requestBuilder.set(
     CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE, 
     CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE_OFF); 
requestBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE, 
     CaptureRequest.NOISE_REDUCTION_MODE_OFF); 
requestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, 
     CaptureRequest.CONTROL_AF_TRIGGER_CANCEL); 

requestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true); 
requestBuilder.set(CaptureRequest.CONTROL_AWB_LOCK, true); 

मैं कितनी तेजी से जानकारी CameraCaptureSession.CaptureCallback में आता है के बारे में निश्चित नहीं हूँ। इसमें छवि डेटा नहीं है, और इसे ImageReader.OnImageAvailableListener से पहले या बाद में बुलाया जा सकता है। ImageReader.OnImageAvailableListener कॉल के बीच समय मापने का प्रयास करें। और छवियों को पढ़ने और उन्हें छोड़ना न भूलें, क्योंकि बफर भरने पर छवियां उपलब्ध नहीं हैं और छवियां जारी नहीं की गई हैं। उदाहरण के लिए:

private class imageAvailableListener implements 
      ImageReader.OnImageAvailableListener { 
     @Override 
     public void onImageAvailable(ImageReader ir) { 
      Log.i(TAG, "Time = " + System.currentTimeMillis()); 
      Image im = ir.acquireNextImage(); 
      im.close(); 
     } 
    } 

ImageReader mImageReader = ImageReader.newInstance(imageReaderWidth, 
        imageReaderHeight, ImageFormat.YUV_420_888, 2); 
mImageReader.setOnImageAvailableListener(
        new imageAvailableListener(), null); 
+0

मुझे यह उल्लेख करना चाहिए था कि मैं जेपीईजी का उपयोग कर रहा था और वाईयूवी नहीं। यह हमारे कोड में मुख्य अंतर था (जिसे मैंने अभी आपके उत्तर के दूसरे भाग में देखा था)। तो, मेरा बुरा। हालांकि मैं मदद की सराहना करता हूं। – acheroncaptain

+0

काम करना! गैलेक्सी एस 3 पर 100 एमएस कम करें - साइनोजनमोड 12.1 (लॉलीपॉप) – Lucas

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