2017-05-11 5 views
1

현재 내 애플리케이션에 맞춤 카메라가 구현되어 있습니다. 나는 두 가지 작은 문제를 겪고있다.맞춤형 카메라의 커플 문제

1) 카메라의 영상 (전면 &)을 흑백으로 전환하면 오디오 입력이 끊어지고 비디오 만 녹화됩니다.

2) 내 카메라 뷰 (앞면 &)가 감가 상각되는 방식을 결정하는 방법 & 정확히 해결 방법을 모르겠습니다. 이 코드의 코드는 다음과 같습니다. 감가 상각 된 부분은 장치가 변수로 저장하는 것입니다. xCode가 "AVCaptureDeviceDiscoverySession을 대신 사용하십시오."라고 알려줍니다.

내 변수 :

let captureSession = AVCaptureSession() 
     var currentDevice:AVCaptureDevice? 
     var backFacingCamera: AVCaptureDevice? 
     var frontFacingCamera: AVCaptureDevice? 
     var videoFileOutput : AVCaptureMovieFileOutput? 
     var cameraPreviewLayer : AVCaptureVideoPreviewLayer? 
     @IBOutlet weak var recordingView: UIView! 

전환 카메라 :

var device = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .back) 
     func switchCameras() { 
       captureSession.beginConfiguration() 

       // Change the device based on the current camera 
       let newDevice = (currentDevice?.position == AVCaptureDevicePosition.back) ? frontFacingCamera : backFacingCamera 

       // Remove all inputs from the session 
       for input in captureSession.inputs { 
        captureSession.removeInput(input as! AVCaptureDeviceInput) 
       } 

       // Change to the new input 
       let cameraInput:AVCaptureDeviceInput 
       do { 
        cameraInput = try AVCaptureDeviceInput(device: newDevice) 
       } catch { 
        print(error) 
        return 
       } 

       if captureSession.canAddInput(cameraInput) { 
        captureSession.addInput(cameraInput) 
       } 

       currentDevice = newDevice 
       captureSession.commitConfiguration() 

       if currentDevice?.position == .front { 
        flashButton.isHidden = true 
        flashButton.isEnabled = false 
       } else if currentDevice?.position == .back { 
        flashButton.isHidden = false 
        flashButton.isEnabled = true 
       } 

      } 

& 내보기가 나타납니다에서 :

여기에 기록 일반 카메라로
let devices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) as! [AVCaptureDevice] 

    // Get the front and back-facing camera for taking photos 
    for device in devices { 
     if device.position == AVCaptureDevicePosition.back { 
      backFacingCamera = device 

     } else if device.position == AVCaptureDevicePosition.front { 
      frontFacingCamera = device 
     } 
    } 
    currentDevice = backFacingCamera 
    guard let captureDeviceInput = try? AVCaptureDeviceInput(device: currentDevice) else { 
     return 
    } 

는 코드입니다
mediaViewCapture.frame = CGRect(x: self.view.frame.size.width * 0, y: self.view.frame.size.height * 0, width:self.view.frame.size.width, height: self.view.frame.size.height) 
     self.view.addSubview(mediaViewCapture) 

     captureSession.sessionPreset = AVCaptureSessionPresetHigh 

     let devices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) as! [AVCaptureDevice] 

     // Get the front and back-facing camera for taking photos 
     for device in devices { 
      if device.position == AVCaptureDevicePosition.back { 
       backFacingCamera = device 

      } else if device.position == AVCaptureDevicePosition.front { 
       frontFacingCamera = device 
      } 
     } 
     currentDevice = backFacingCamera 
     guard let captureDeviceInput = try? AVCaptureDeviceInput(device: currentDevice) else { 
      return 
     } 

     let audioInputDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeAudio) 

     do 
     { 
      let audioInput = try AVCaptureDeviceInput(device: audioInputDevice) 

      // Add Audio Input 
      if captureSession.canAddInput(audioInput) 
      { 
       captureSession.addInput(audioInput) 
      } 
      else 
      { 
       NSLog("Can't Add Audio Input") 
      } 
     } 
     catch let error 
     { 
      NSLog("Error Getting Input Device: \(error)") 
     } 

     videoFileOutput = AVCaptureMovieFileOutput() 
     captureSession.addInput(captureDeviceInput) 
     captureSession.addOutput(videoFileOutput) 
     cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
     view.layer.addSublayer(cameraPreviewLayer!) 
     cameraPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
     cameraPreviewLayer?.frame = mediaViewCapture.layer.frame 
     captureSession.startRunning() 

& 마지막으로 내 캡처 :

func capture(_ captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAt outputFileURL: URL!, fromConnections connections: [Any]!, error: Error!) { 
    if error == nil { 
     turnFlashOff() 
     let videoVC = VideoPreviewVC() 
     videoVC.url = outputFileURL 
     self.navigationController?.pushViewController(videoVC, animated: false) 
    } else { 
     print("Error saving the video \(error)") 
    } 
    } 
+0

일반적으로 오디오 장치를 추가하는 경우에도 장치 변경 기능에서 모든 장치를 제거하고 오디오 장치가 아닌 비디오 장치 만 추가하십시오 – Scriptable

답변

1
가 다음되지 그것을위한 코드입니다 같이 대신 AVCaptureDevice의 사용 AVCaptureDeviceDiscoverySession 볼 수 있습니다

:

let deviceDiscovery = AVCaptureDeviceDiscoverySession(deviceTypes: [AVCaptureDeviceType.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .back) 
     let devices = deviceDiscovery?.devices 
     for device in devices! { 
      if device.hasMediaType(AVMediaTypeVideo) { 
       captureDevice = device 
      } 
     } 

AVCaptureDeviceType하는 유형 다음했습니다 builtInMicrophone, builtInWideAngleCamera, builtInTelephotoCamera, builtInDualCamera 및 builtInDuoCamera.

카메라를 전환 할 때 audioInput 문제를 확인해야합니다.