2017-08-09 5 views
0

私はiOSの新しい蜂です。簡単なアプリケーションで作業しています。カスタムカメラが必要です。私はAVFoundationを使用していますが、アプリが長時間黒い画面を表示していて、カメラがロードされています。ここに私のコードですAVCoundationカメラがフロントカメラ(リフレッシュカメラ)に切り替わるときにクラッシュする

func prepareCamera() { 
    captureSession.sessionPreset = AVCaptureSessionPresetPhoto 
    if frontCam{ 
    if let availableDevices = AVCaptureDeviceDiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .front).devices { 
     captureDevice = availableDevices.first 
     DispatchQueue(label: "prepare").async { 
     self.beginSession() 
     } 
    } 
    }else{ 
     if let availableDevices = AVCaptureDeviceDiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .back).devices { 
      captureDevice = availableDevices.first 
      beginSession() 
     } 
    } 
} 
@IBAction func switchCameraBtnClicked(_ sender: Any) { 
    frontCam = !frontCam 
    prepareCamera() 
} 
func beginSession() { 

    do { 
     let captureDeviceInput = try AVCaptureDeviceInput(device: captureDevice) 
     if let inputs = captureSession.inputs as? [AVCaptureDeviceInput] { 
      for input in inputs { 
       captureSession.removeInput(input) 
      } 
     } 
     if captureSession.inputs.isEmpty { 
    captureSession.addInput(captureDeviceInput) 
     } 

    }catch { 
     print(error.localizedDescription) 
    } 


    if let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) { 
     self.previewLayer = previewLayer 
     // self.view.layer.addSublayer(self.previewLayer) 
     self.view.layer.insertSublayer(self.previewLayer, at: 0) 
     self.previewLayer.frame = self.view.layer.frame 

     captureSession.startRunning() 

     let dataOutput = AVCaptureVideoDataOutput() 
     dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString):NSNumber(value:kCVPixelFormatType_32BGRA)] 

     dataOutput.alwaysDiscardsLateVideoFrames = true 

     if captureSession.canAddOutput(dataOutput) { 
      captureSession.addOutput(dataOutput) 
     } 

     captureSession.commitConfiguration() 


     let queue = DispatchQueue(label: "com.graymatics.customcamera") 
     dataOutput.setSampleBufferDelegate(self, queue: queue) 



    } 

} 

コードが適切でない場合は、私に修正してください。

override func viewDidDisappear(_ animated: Bool) { 
     self.stopCaptureSession() 
    } 


func stopCaptureSession() { 
     self.captureSession.stopRunning() 

     if let inputs = captureSession.inputs as? [AVCaptureDeviceInput] { 
      for input in inputs { 
       self.captureSession.removeInput(input) 
      } 
     }   
    } 

セッションが現在のビューコントローラから上に移動させながら停止する必要があります

答えて

0

は、最後にソリューションここ

私のコードがあるを発見しました。

関連する問題