2016-11-22 85 views
7

蘋果的AVCam演示應用程序的演示源代碼在這裏找到:https://developer.apple.com/library/content/samplecode/AVCam/Introduction/Intro.html當試圖拍攝照片(無論你是否構建Objective-C或Swift版本)在AVCamCameraViewController/CameraViewController(Swift ),其捕獲照片:AVCam項目在iPad上崩潰

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

或(SWIFT)

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

崩潰時的錯誤信息是:

2016年11月21日17:44:31.590070 AVCam [2178:2303627] *終止應用程序由於 未捕獲的異常 'NSInvalidArgumentException',原因:「* - [AVCapturePhotoOutput capturePhotoWithSettings:代表:] flashMode必須被設置爲存在於supportedFlashModes陣列」

在一個值,當本人檢查閃光模式陣列,我得到這樣的:

(LLDB)PO [self.photoOutput supportedFlashModes] < __NSSingleObjectArrayI 0x1700 07c50>(0)

所以爲了增加閃光模式,文檔說,你必須指定要在AVCapturePhotoSettings對象支持什麼模式。我已經做了這一行代碼:

photoSettings.flashMode = AVCaptureFlashModeAuto; 

或(SWIFT)

photoSettings.flashMode = .auto 

所以我的預感是,這是專門涉及到12.9" 的iPad Pro和我的錯誤大概需要提交的雷達,但想到我會問這裏萬一有人在看過它。任何想法?

更新

我已經能夠複製這些其他iPad,所以它似乎不是隻有12.9英寸的iPad Pro。

+0

猜提交雷達。相同的代碼庫正在處理所有的iPhone和iPad空氣,沒有任何崩潰。我沒有iPad Pro來測試它:( – Bluewings

+0

我所做的是確定當前的設備是.front還是.back,並且我將flashMode設置爲.off,或者.front或.unspecified和.auto,否則。我希望這可以幫助。 – psparago

+0

有沒有解決?有同樣的問題,但無法確認至極的iPad版本用戶有:( – 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我剛剛編輯了問題以改進格式。 Soja給出了答案 – slfan

+0

@soja您可以添加更多關於該解決方案爲何解決問題的細節? –

+1

@WDyson它會檢查相機在使用中的位置。如果位置在前面或未指定,則閃光模式關閉。否則它的.auto。我相信有一個錯誤.auto ...蘋果需要修正他們的代碼。 – Soja

0

寫這行信息的plist

Privacy - Camera Usage Description 
+0

感謝您的建議。我已經在Info.plist文件中擁有該密鑰。仍然崩潰。 –

0

因此,基於Soja的回答,我決定詢問由photoOutput變量AVCapturePhotoOutput提供的supportedFlashModes陣列。

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模式正在嘗試使用它之前的支持。這裏的差異和問題似乎與iPhone和iPad的設備類型有關,因爲iPad沒有像iPhone一樣的背面閃光燈。換句話說,它可以在我的手機上正常工作。

2

//對於在MacOS上使用ObjectiveC提供的代碼版本嘗試使用Apple提供的AVCam示例代碼時可能遇到此問題的人,只需添加以下內容(在Objective C中):

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]