2016-11-22 6 views
7

एवीकैम डेमो ऐप के लिए ऐप्पल का डेमो स्रोत कोड यहां मिला: https://developer.apple.com/library/content/samplecode/AVCam/Introduction/Intro.htmlAVCamCameraViewController/CameraViewController (स्विफ्ट) में लाइन पर एक तस्वीर लेने का प्रयास करते समय क्रैश हो जाता है (चाहे आप उद्देश्य-सी या स्विफ्ट संस्करण बनाते हों)) तस्वीर कैप्चर करने वाली:आईपैड पर एवीकैम प्रोजेक्ट क्रैश

[self.photoOutput capturePhotoWithSettings:photoSettings delegate:photoCaptureDelegate]; 

या (स्विफ्ट)

self.photoOutput.capturePhoto(with: photoSettings, delegate: photoCaptureDelegate) 

त्रुटि संदेश जब यह दुर्घटनाओं है:

2016/11/21 17: 44: ३१.५,९०,०७० AVCam [2178: 2,303,627] * कारण न आया हुआ अपवाद 'NSInvalidArgumentException', कारण करने के लिए एप्लिकेशन समाप्त: '* - [AVCapturePhotoOutput capturePhotoWithSettings: प्रतिनिधि:] flashMode में सेट होना चाहिए supportedFlashModes सरणी '

में एक मूल्य के वर्तमान और जब मैं फ्लैश मोड सरणी की जांच, मैं इस मिल:

(lldb) पो [self.photoOutput supportedFlashModes] < __NSSingleObjectArrayI 0x1700 07c50> (0)

फ़्लैश मोड जोड़ने के लिए

तो, डॉक्स कहते हैं कि तुम क्या मोड आप AVCapturePhotoSettings वस्तु में समर्थन करना चाहते हैं निर्दिष्ट करना होगा। मैं कोड की इस पंक्ति के साथ किया है कि:

photoSettings.flashMode = AVCaptureFlashModeAuto; 

या (स्विफ्ट)

photoSettings.flashMode = .auto 

तो मेरी कूबड़ है कि इस विशेष रूप से 12.9 "iPad प्रो और मैं से संबंधित एक बग है है शायद एक रडार प्रस्तुत करने की आवश्यकता है, लेकिन सोचा था कि मैं यहाँ पूछना होगा मामले में किसी को। पहले यह देखा है कोई भी विचार?

अद्यतन

मैं इस अन्य आईपैड को भी डुप्लिकेट करने में सक्षम हूं, इसलिए यह केवल 12.9 "आईपैड प्रो नहीं है।

+0

अनुमान हम एक रडार प्रस्तुत करने की आवश्यकता। समान कोड बेस बिना किसी क्रैश के सभी आईफ़ोन और आईपैड एयर पर काम कर रहा है। मेरे पास इसका परीक्षण करने के लिए आईपैड प्रो नहीं है :( – Bluewings

+0

मैंने जो किया है यह निर्धारित करने के लिए है कि वर्तमान डिवाइस है .front या .back और मैंने फ्लैशमोड को .front के लिए .off या setscified और .auto अन्यथा सेट किया है। मुझे उम्मीद है कि यह मदद करता है। – psparago

+0

क्या यह कभी हल हो गया था? एक ही समस्या है। लेकिन उपयोगकर्ता के पास आईपैड संस्करण की पुष्टि नहीं कर सका। :( – hadez30

उत्तर

7

में इस लाइन इस जोड़ें ...

let position = self.videoDeviceInput.device.position 
photoSettings.flashMode = position == .front || position == .unspecified ? .off : .auto 
सही इस से पहले

...

self.photoOutput.capturePhoto(with: photoSettings, delegate: photoCaptureDelegate) 

कि इस समस्या को ठीक करना चाहिए।

+0

@WDyson मैंने प्रारूपण को बेहतर बनाने के लिए अभी प्रश्न संपादित किया है। सोजा ने जवाब दिया – slfan

+0

@ सोजा क्या आप इस समाधान को हल करने के बारे में अधिक जानकारी जोड़ सकते हैं? –

+1

@WDyson यह उपयोग में कैमरे की स्थिति के लिए जांचता है। यदि स्थिति सामने या अनिर्दिष्ट है, तो फ्लैश मोड बंद है। अन्यथा इसके .auto पर। मेरा मानना ​​है कि .auto के साथ एक बग है ... कुछ एप्पल को अपने कोड में ठीक करने की जरूरत है। – Soja

0

लिखने की जानकारी plist

Privacy - Camera Usage Description 
+0

सुझाव के लिए धन्यवाद। मेरे पास पहले से Info.plist फ़ाइल में वह कुंजी है। अभी भी दुर्घटनाग्रस्त –

0

तो सोजा के उत्तर पर निर्माण, मैंने चर द्वारा प्रदत्त supportedFlashModes सरणी पूछताछ करने का निर्णय लिया जो AVCapturePhotoOutput है।

self.inProgressPhotoCaptureDelegates[photoCaptureDelegate.requestedPhotoSettings.uniqueID] = photoCaptureDelegate 

if let _ = self.photoOutput.supportedFlashModes.filter({ (mode) -> Bool in 
    return mode.intValue == AVCaptureFlashMode.auto.rawValue 
}).last { 
    let position = self.videoDeviceInput.device.position 
    photoSettings.flashMode = position == .front || position == .unspecified ? .off : .auto 
} else { 
    photoSettings.flashMode = .off 
} 

self.photoOutput.capturePhoto(with: photoSettings, delegate: photoCaptureDelegate) 

शायद यह करने के लिए कुछ और अधिक व्यापक तरीके हैं, लेकिन यह है कि .auto मोड इसका इस्तेमाल करने के प्रयास करने से पहले समर्थित है सुनिश्चित करता है। यहां अंतर और समस्या डिवाइस के प्रकार से संबंधित है, आईफोन बनाम आईपैड इस तथ्य के कारण है कि आईपैड के पास iPhones की तरह पीछे की फ्लैश नहीं है। दूसरे शब्दों में, यह मेरे फोन पर ठीक काम करता है।

2

// कोड के उद्देश्य सी आपूर्ति संस्करण का उपयोग करके, मैकोज़ पर एक्सकोड में ऐप्पल आपूर्ति किए गए एवीकैम नमूना कोड का उपयोग करने की कोशिश करते समय भी इस समस्या का सामना करने वाले किसी व्यक्ति के लिए, इसे केवल (उद्देश्य सी में) जोड़ें:

AVCaptureDevicePosition position = self.videoDeviceInput.device.position; 
if (position == AVCaptureDevicePositionFront) 
{ 
    photoSettings.flashMode = AVCaptureFlashModeOff; 
} 
else 
{ 
    photoSettings.flashMode = AVCaptureFlashModeAuto; 
} 


//right before: 

[self.photoOutput.capturePhoto(with: photoSettings, delegate: photoCaptureDelegate] 
2

अगर डिवाइस का समर्थन करता है "फ़्लैश" के साथ मोड आप की जांच करना चाहिए:

[self.photoOutput.supportedFlashModes containsObject:[NSNumber numberWithInt:AVCaptureFlashModeOn]]) 

और उसके बाद का उपयोग करें:

+०१२३५१६४१०
@property (nonatomic) AVCapturePhotoOutput *photoOutput; 


AVCapturePhotoSettings *photoSettings = [AVCapturePhotoSettings photoSettings]; 


    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
     if ([device hasTorch] && [device hasFlash]){ 
      [device lockForConfiguration:nil]; 
      if([self.photoOutput.supportedFlashModes containsObject:[NSNumber numberWithInt:AVCaptureFlashModeOn]]){ 
       [device setFlashMode:AVCaptureFlashModeOn]; 
       photoSettings.flashMode = AVCaptureFlashModeAuto; 
      } 
      else{ 
       photoSettings.flashMode = AVCaptureFlashModeOff; 
      } 
      [device unlockForConfiguration]; 
     } 
     else{ 
      photoSettings.flashMode = AVCaptureFlashModeOff; 
      [device unlockForConfiguration]; 
     } 

तो

[self.photoOutput.capturePhoto(with: photoSettings, delegate: photoCaptureDelegate] 
संबंधित मुद्दे