2017-05-11 16 views
1

現在、私のアプリケーションにはカスタムカメラが実装されています。私は2つの小さな問題にぶつかっています。カスタムカメラとのカップルの問題

1)私はカメラのビュー(前部&のバック)をb/wに切り替えると、オーディオ入力が消え、ビデオのみが記録されます。

2)どのカメラビュー(前部&)が償却されているかを決定するための方法&正確に解決する方法がわかりません。このコードでは、コードは次のとおりです。減価償却された部分は、デバイスが変数として格納されている部分です。 xCodeは私に「AVCaptureDeviceDiscoverySessionを代わりに使用する」と言っています。ここでの記録一般的なカメラ用として

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

      } 

&が表示されます。

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の問題を確認する必要があります。

関連する問題