2017-08-09 149 views
0

我是一個新的蜜蜂,使用swift在簡單的應用程序上工作,因爲我需要一個自定義攝像頭。我使用AVFoundation,但應用程序長時間顯示黑屏,然後加載相機。這裏是我的代碼AVFoundation相機在切換到前置攝像頭時發生崩潰(清爽的攝像頭)

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) 



    } 

} 

如果代碼不正確,請糾正我。

回答

0

終於找到了解決辦法

這裏是我的代碼:

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) 
      } 
     }   
    } 

會議需求的同時,從當前視圖控制器移動停止。

相關問題