2015-04-28 14 views
6

Tôi đã tạo ra một AVCaptureSession để nắm bắt đầu ra video và hiển thị nó cho người sử dụng thông qua UIView. Bây giờ tôi muốn có thể nhấp vào một nút (phương pháp takePhoto) và hiển thị hình ảnh từ phiên trong một UIImageView. Tôi đã cố gắng lặp qua từng kết nối thiết bị và cố gắng để tiết kiệm đầu ra nhưng không hoạt động. Mã tôi có bên dưới làAVCapture phiên Để capture image SWIFT

let captureSession = AVCaptureSession() 
var stillImageOutput: AVCaptureStillImageOutput! 

@IBOutlet var imageView: UIImageView! 
@IBOutlet var cameraView: UIView! 


// If we find a device we'll store it here for later use 
var captureDevice : AVCaptureDevice? 

override func viewDidLoad() { 
    // Do any additional setup after loading the view, typically from a nib. 
    super.viewDidLoad() 
    println("I AM AT THE CAMERA") 
    captureSession.sessionPreset = AVCaptureSessionPresetLow 
    self.captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 
    if(captureDevice != nil){ 
     beginSession() 
    } 
} 
    func beginSession() { 

    self.stillImageOutput = AVCaptureStillImageOutput() 
    self.captureSession.addOutput(self.stillImageOutput) 
    var err : NSError? = nil 
    self.captureSession.addInput(AVCaptureDeviceInput(device: self.captureDevice, error: &err)) 

    if err != nil { 
     println("error: \(err?.localizedDescription)") 
    } 

    var previewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession) 
    self.cameraView.layer.addSublayer(previewLayer) 
    previewLayer?.frame = self.cameraView.layer.frame 
    captureSession.startRunning() 
} 

@IBAction func takePhoto(sender: UIButton) { 
    self.stillImageOutput.captureStillImageAsynchronouslyFromConnection(self.stillImageOutput.connectionWithMediaType(AVMediaTypeVideo)) { (buffer:CMSampleBuffer!, error:NSError!) -> Void in 
     var image = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer) 
     var data_image = UIImage(data: image) 
     self.imageView.image = data_image 
    } 
} 
} 
+0

Bắt lỗi này ngay bây giờ 'Chấm dứt ứng dụng do ngoại lệ còn tự do 'NSInvalidArgumentException', lý do: '*** Không thể thêm đầu ra để chụp phiên -> -> vì nhiều hơn một đầu ra cùng loại là unsupported.'' –

+0

Bắt đầu bằng cách đưa ra khỏi dòng: captureSession.addOutput (self.stillImageOutput) và xem nơi bạn đang thêm. Điều đó sẽ khắc phục lỗi. – user3353890

+0

@ user3353890 i cố định các lỗi (Tôi cập nhật các mã trên) nhưng bây giờ tôi chỉ nhận được một hình ảnh tĩnh cho xem trước của tôi thay vì video từ camera ...? –

Trả lời

4

Bạn nên thử thêm một chuỗi mới khi thêm đầu vào và đầu ra cho phiên trước khi bắt đầu. Trong tài liệu của Apple, họ nêu rõ

Quan trọng: Phương thức startRunning là thực hiện thiết lập phiên trên hàng đợi nối tiếp để hàng đợi chính không bị chặn (giữ giao diện người dùng) đáp ứng). Xem AVCam for iOS cho ví dụ triển khai chính tắc.

Hãy thử sử dụng một công văn trong tạo phiên phương pháp như dưới đây

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), { // 1 
     self.captureSession.addOutput(self.stillImageOutput) 
     self.captureSession.addInput(AVCaptureDeviceInput(device: self.captureDevice, error: &err)) 
     self.captureSession.sessionPreset = AVCaptureSessionPresetPhoto 
     if err != nil { 
      println("error: \(err?.localizedDescription)") 
     } 
     var previewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession) 
     previewLayer?.frame = self.cameraView.layer.bounds 
     previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
     dispatch_async(dispatch_get_main_queue(), { // 2 
        // 3 
      self.cameraView.layer.addSublayer(previewLayer) 
      self.captureSession.startRunning() 
      }); 
     }); 
+0

Cảm ơn điều này đã kết thúc! –