2014-11-13 3 views
0

카메라를 통해 이미지를 캡처해야합니다. 그러나 다음과 같은 오류가 발생합니다 : 'NSInvalidArgumentException', 이유 : 'AVCaptureDevice를 직접 인스턴스화 할 수 없습니다.'iOS 카메라에서 사진 찍기

var session: AVCaptureSession! 
    var device: AVCaptureDevice! 
    var captureVideoPreviewLayer: AVCaptureVideoPreviewLayer! 
    var image: UIImage! 
    var input: AVCaptureDeviceInput! 
    var stillImageOutput: AVCaptureStillImageOutput! 
    var viewControllerScheduling: RentalSchedulingViewController! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     session = AVCaptureSession() 
     session.sessionPreset = AVCaptureSessionPresetPhoto; 
     captureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) 
     captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
     captureVideoPreviewLayer.frame = self.view.frame 
     self.view.layer.addSublayer(captureVideoPreviewLayer) 
     var error = NSErrorPointer() 
     captureVideoPreviewLayer.session.beginConfiguration() 
     input = AVCaptureDeviceInput(device: self.getBackCamera(), error: error) 
     session.addInput(input) 
     captureVideoPreviewLayer.session.commitConfiguration() 
     stillImageOutput = AVCaptureStillImageOutput() 
     var outputSettings = NSDictionary(objectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey) 
     stillImageOutput.outputSettings = outputSettings 
     session.addOutput(stillImageOutput) 
     session.startRunning() 
    } 

물러서 카메라 :

코드 따릅니다

func getBackCamera() -> AVCaptureDevice { 
     var devic = AVCaptureDevice() 
     let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) as NSArray 
     for dev in devices { 
      devic = dev as AVCaptureDevice 
      if devic.position == AVCaptureDevicePosition.Back { 
       return devic 
      } 
     } 
     return devic 
    } 

이벤트 캡처를 이미지 :

@IBAction func capture(sender: AnyObject) { 
     var videoConnection = AVCaptureConnection() 

     for con in stillImageOutput.connections { 
      let connection = con as AVCaptureConnection 

      for p in connection.inputPorts { 
       let port = p as AVCaptureInputPort 

       if port.mediaType == AVMediaTypeVideo { 
        videoConnection = connection 
        break; 
       } 
      } 
     } 

     stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) { 
      (imageSampleBuffer, error) in 
      if imageSampleBuffer != nil { 
       let imageData = AVCaptureStillImageOutput .jpegStillImageNSDataRepresentation(imageSampleBuffer) 
       self.processImage(UIImage(data: imageData)!) 
      } 
     } 
    } 

processment 이미지 :

func processImage(image: UIImage) { 
     UIGraphicsBeginImageContext(CGSizeMake(320, 426)); 
     image.drawInRect(CGRectMake(0, 0, 320, 426)) 
     let smallImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext(); 

     let cropRect = CGRectMake(0, 55, 320, 320) 
     let imageRef = CGImageCreateWithImageInRect(smallImage.CGImage, cropRect) 
     self.image = UIImage(CGImage: imageRef) 
    } 

오류가 바로 여기 발생 :이 문제를 찾고 있었어요

input = AVCaptureDeviceInput(device: self.getBackCamera(), error: error) 
+1

시뮬레이터를 테스트하거나 카메라가있는 실제 장치를 사용하고 있습니까? –

+0

실제 장치에서 테스트 – Gian

답변

2

. 그것은 당신이 실제로 장치 AVCaptureDevice 개체를 인스턴스 수없는 것 같습니다. 참조로 전달해야합니다. 이것이 내가이 도전을 극복 한 방법입니다. AVCaptureDeviceInput 객체에 대한 참조로 전달한 클래스를 인스턴스화하지 않았습니다.

희망이 도움이되었습니다!

var captureDevice : AVCaptureDevice? 

    let devices = AVCaptureDevice.devices() 

    // Loop through all the capture devices on this phone 
    for device in devices { 
     // Make sure this particular device supports video 
     if (device.hasMediaType(AVMediaTypeVideo)) { 
      // Finally check the position and confirm we've got the back camera 
      if(device.position == AVCaptureDevicePosition.Back) { 
       captureDevice = device as? AVCaptureDevice 
      } 
     } 
    } 

} 
0

은 아마 당신은 그 동안 그것을 해결하지만,이 같은 코드를 변경하는 경우 그것을 작동합니다 :

그냥 getBackCamera()

devic = AVCaptureDevice()을 제거하고 머리에 선언을 이 클래스는 다음과 같습니다. var device, devic : AVCaptureDevice!

class ViewController: UIViewController { 

var session: AVCaptureSession! 
var device, devic : AVCaptureDevice! 
var captureVideoPreviewLayer: AVCaptureVideoPreviewLayer! 
var image: UIImage! 
var input: AVCaptureDeviceInput! 
var stillImageOutput: AVCaptureStillImageOutput! 
//var viewControllerScheduling: RentalSchedulingViewController! 


override func viewDidLoad() { 
    super.viewDidLoad() 

    session = AVCaptureSession() 
    session.sessionPreset = AVCaptureSessionPresetPhoto; 
    captureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) 
    captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
    captureVideoPreviewLayer.frame = self.view.frame 
    self.view.layer.addSublayer(captureVideoPreviewLayer) 
    var error = NSErrorPointer() 
    captureVideoPreviewLayer.session.beginConfiguration() 
    input = AVCaptureDeviceInput(device: self.getBackCamera(), error: error) 
    session.addInput(input) 
    captureVideoPreviewLayer.session.commitConfiguration() 
    stillImageOutput = AVCaptureStillImageOutput() 
    var outputSettings = NSDictionary(objectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey) 
    stillImageOutput.outputSettings = outputSettings as [NSObject : AnyObject] 
    session.addOutput(stillImageOutput) 
    session.startRunning() 

} 

func getBackCamera() -> AVCaptureDevice { 
    // devic = AVCaptureDevice() 
    let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) as NSArray 
    for dev in devices { 
     devic = dev as! AVCaptureDevice 
     if devic.position == AVCaptureDevicePosition.Back { 
      return devic 
     } 
    } 
    return devic 
} 
관련 문제