2017-05-18 5 views
17

Je veux enregistrer la vidéo et audio jouer simultanément. Lorsque vous démarrez l'enregistrement de la vidéo, la lecture du début audio préchargé et lorsque vous arrêtez l'enregistrement vidéo, le son s'arrête également.Enregistrement vidéo et lecture audio en même temps ios

J'ai essayé d'enregistrer une vidéo en utilisant la bibliothèque tiers « SwiftyCam » (https://github.com/Awalz/SwiftyCam) et commencer la lecture audio en mode de démarrage lorsque délégué écrit le fichier d'enregistrement vidéo.

principal code viewController

est ci-dessous:

override func viewDidAppear(_ animated: Bool) { 
super.viewDidAppear(animated) 
var temp = Data() 
let audioPath = Bundle.main.path(forResource: "ab1-FAST", ofType: "mp3") 
     temp = FileManager.default.contents(atPath: (audioPath)!)! 
    do { 
      player = try AVAudioPlayer(data: temp) 
     } 
     catch let error { 

      print(error) 
     } 

     self.configureAudioSession() 
     player!.delegate = self 
     self.player!.prepareToPlay() 
} 

    // MARK: - 
    // MARK: - SwiftyCamViewControllerDelegate method 

func swiftyCam(_ swiftyCam: SwiftyCamViewController, didBeginRecordingVideo camera: SwiftyCamViewController.CameraSelection) { 
    self.player?.play() 
} 

func swiftyCam(_ swiftyCam: SwiftyCamViewController, didFinishRecordingVideo camera: SwiftyCamViewController.CameraSelection) 
{ 
     if self.player != nil{ 
      if (self.player?.isPlaying)! { 
       self.player?.stop() 
      } 
     } 
} 


@IBAction func btnStartStopClick(_ sender: UIButton) { 

     sender.isSelected = !sender.isSelected 
     if sender.isSelected{ 

      DispatchQueue.main.async { 
       self.objVideoRecorderVC.startVideoRecording() 
      } 
     }else{ 
      self.objVideoRecorderVC.stopVideoRecording() 

     } 
    } 

swiftycam Bibliothèque:

/** 

    Begin recording video of current session 

    SwiftyCamViewControllerDelegate function SwiftyCamDidBeginRecordingVideo() will be called 

    */ 
public func startVideoRecording() { 
     guard let movieFileOutput = self.movieFileOutput else { 
      return 
     } 

     if currentCamera == .rear && flashEnabled == true { 
      enableFlash() 
     } 

     if currentCamera == .front && flashEnabled == true { 
      flashView = UIView(frame: view.frame) 
      flashView?.backgroundColor = UIColor.white 
      flashView?.alpha = 0.85 
      previewLayer.addSubview(flashView!) 
     } 

     sessionQueue.async { [unowned self] in 
      if !movieFileOutput.isRecording { 
       if UIDevice.current.isMultitaskingSupported { 
        self.backgroundRecordingID = UIApplication.shared.beginBackgroundTask(expirationHandler: nil) 
       } 

       // Update the orientation on the movie file output video connection before starting recording. 
       let movieFileOutputConnection = self.movieFileOutput?.connection(withMediaType: AVMediaTypeVideo) 


       //flip video output if front facing camera is selected 
       if self.currentCamera == .front { 
        movieFileOutputConnection?.isVideoMirrored = true 
       } 

       movieFileOutputConnection?.videoOrientation = self.getVideoOrientation() 

       // Start recording to a temporary file. 
       let outputFileName = UUID().uuidString 
       let outputFilePath = (NSTemporaryDirectory() as NSString).appendingPathComponent((outputFileName as NSString).appendingPathExtension("mov")!) 


       movieFileOutput.startRecording(toOutputFileURL: URL(fileURLWithPath: outputFilePath), recordingDelegate: self) 
       self.isVideoRecording = true 
    DispatchQueue.main.async { 
        self.cameraDelegate?.swiftyCam(self, didBeginRecordingVideo: self.currentCamera) 
       } 
      } 
      else { 
       movieFileOutput.stopRecording() 
      } 
     } 
    } 

question: obtenir parfois un retard de démarrage lecture audio en une microseconde. lors de la lecture du début audio et de l'enregistrement du son dans l'enregistrement vidéo, une synchronisation de l'heure correcte et un certain retard dans le son.

Je vérifie avec audio de fusion avec le son original et il y a un certain retard, comme indiqué ci-dessous l'image. le problème n'est pas toujours mais aléatoire et pas synchronisé. enter image description here

enter image description here sont des solutions? comment faire enregistrer de la vidéo et la lecture audio en même temps (clic sur un seul bouton) démarrer et sans délai et sans problème de synchronisation? est-ce un autre moyen?

pour l'audio de jeu utilisé: AVAudioPlayer

pour la vidéo d'enregistrement utilisé: Swiftycam (AVCaptureSession)

+0

Peut-être que vous pouvez essayer cet AS: http://stackoverflow.com/a/36912798/2859764 –

+0

@AshitZaveri ,,, Je peux jouer audio et enregistrer des vidéos les deux fois. Sur un seul bouton, cliquez sur démarrer la lecture audio et démarrer l'enregistrement vidéo. mais le problème est en cours de lecture audio est de 0,5 sec retardé (pas toujours). –

+1

En théorie, je pense que c'est possible, mais je ne sais pas comment synchroniser ces deux tâches. Espérons que quelqu'un va nous montrer solution élégante – sage444

Répondre

6

chose Couple vous pouvez essayer:

1) Lecture audio sur la file d'attente d'arrière-plan:

dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUN‌​D, 0)) { 
    self.player.play() 
} 

2) Déplacer le code que vous avez dans viewDidAppear (y compris prepareToPlay()) à viewDidLoad. Je suppose que ce sera une suggestion moins utile car la lecture est initiée par l'utilisateur mais il y a un délai entre prepareToPlay() et quand votre audio est prêt.

Si vous les essayez et que le délai est encore trop important, vous devrez peut-être utiliser autre chose que AVAudioPlayer, tel que OpenAL.

+0

J'ai essayé avec le code de déplacement de "viewDidAppear" à "viewDidLoad". aussi essayé avec prepareToPlay() -> play() -> pause() –