2016-11-22 2 views
7

Исходный код Apple для демонстрационного приложения AVCam, найденного здесь: https://developer.apple.com/library/content/samplecode/AVCam/Introduction/Intro.html сбой при попытке сделать снимок (независимо от того, строите ли вы версии Objective-C или Swift) в строке в AVCamCameraViewController/CameraViewController (Swift), который захватывает фото:AVCam Project Crashes On 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) ро [self.photoOutput supportedFlashModes] < __NSSingleObjectArrayI 0x1700 07c50> (0)

Поэтому для того, чтобы добавить режим вспышки, документы говорят, вы должны указать, какие режимы вы хотите поддерживать в AVCapturePhotoSettings объекте. Я сделал, что с этой строки кода:

photoSettings.flashMode = AVCaptureFlashModeAuto; 

или (Swift)

photoSettings.flashMode = .auto 

Так что моя догадка, что это ошибка конкретно связана с 12.9" IPad Pro и I вероятно, необходимо представить радар, но думал, что я хотел бы спросить здесь, в случае, если кто-то видел его раньше. есть идеи?

Update

Я также смог дублировать и другие iPads, так что это, похоже, не только 12,9 "iPad Pro.

+0

Guess мы должны представить радар. Такая же база кода работает на всех 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 ... что-то Apple нужно исправить в своем коде. – Soja

0

написать эту линию в информационном PLIST

Privacy - Camera Usage Description 
+0

Спасибо за предложение. У меня уже есть ключ в файле Info.plist. Все еще падает. –

0

Так что, построив ответ на Soja, я решил допросить массив supportedFlashModes, предоставленный переменной photoOutput, которая является 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 поддерживается, прежде чем использовать его. Разница и проблема здесь, похоже, относятся к типу устройства, iPhone против iPad из-за того, что у iPad нет вспышки на спине, как у iPhone. Другими словами, он отлично работает на моем телефоне.

2

// Также для тех, кто может столкнуться с этой проблемой при попытке использовать образец кода AVCam, поставляемый Apple, в XCode на MacOS, используя поставляемую версию кода Objective C, просто добавьте это (в 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

Вы должны проверить, если устройство поддерживает "Flash" режим с:

[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]