2017-05-11 6 views
1

J'ai actuellement une caméra personnalisée implémentée dans mon application. Je suis confronté à deux petites questions.Problème de couple avec caméra personnalisée

1) Lorsque je change de vue en noir et blanc les vues de la caméra (avant & arrière) l'entrée audio meurt, et enregistre uniquement la vidéo.

2) Ma méthode pour décider quelle vue de la caméra (avant & arrière) est, qui est dépréciée, & Je ne sais pas comment s'y prendre pour la résoudre. Pour celui-ci, le code est le suivant: La partie dépréciée est celle que les périphériques stockent en tant que variables. xCode me dit: "Utilisez AVCaptureDeviceDiscoverySession à la place."

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 
    } 

Quant à la caméra générale enregistrement voici les codes:

Mes variables:

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

caméras de commutation:

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 
       } 

      } 

& À mon avis apparaîtra:

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

& Enfin ma capture:

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

Vous ajoutez généralement le périphérique audio, dans la fonction de changement de périphérique, vous supprimez tous les périphériques et vous ajoutez uniquement un périphérique vidéo et non un périphérique audio – Scriptable

Répondre

1

Vous pouvez regarder l'utilisation AVCaptureDeviceDiscoverySession au lieu de AVCaptureDevice comme il est dépréciée suivant est le code pour elle:

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 a les modèles suivants: builtInMicrophone, BuiltInWideAngleCamera, builtInTelephotoCamera, builtInDualCamera et builtInDuoCamera.

Besoin de vérifier le problème d'entrée audio lorsque la caméra est commutée.