Enregistrement vidéo et lecture audio en même temps ios

je veux enregistrer la vidéo et lire l'audio simultanément. lorsque vous commencez l'enregistrement vidéo, l'audio préchargé commencer la lecture et lorsque vous arrêtez l'enregistrement vidéo, l'audio s'arrête également la lecture.

j'ai essayé D'enregistrer la vidéo en utilisant la bibliothèque de tiers " SwiftyCam" (https://github.com/Awalz/SwiftyCam) et commencer à jouer l'audio dans la méthode delegate quand commence écrit le dossier d'enregistrement vidéo.

le code du contrôleur de la vue principale 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()

        }
  }

bibliothèque swiftycam:

/**

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

problème: il arrive parfois que l'on retarde la lecture de l'audio en microseconde. quand l'audio commence la lecture et l'enregistrement sonore dans l'enregistrement vidéo un certain temps de synchronisation propre et un certain temps de retard dans le son.

je vérifie avec l'audio de fusion avec l'audio d'origine et il y a un certain retard comme montré ci-dessous l'image. le problème n'est pas toujours, mais un retard aléatoire et non synchronisation.enter image description here

enter image description here sont toutes les solutions? comment faire pour enregistrer la vidéo et lire l'audio en même temps (sur un simple clic de bouton) Démarrer et pas de retard et pas de problème de synchronisation? un autre moyen?

pour lire des fichiers audio utilisés: AVAudioPlayer

pour enregistrer de la vidéo utilisée : Swiftycam (AVCaptureSession)

17
demandé sur Bhargav B. Bajani 2017-05-18 09:53:47

1 réponses

Quelques chose que vous pouvez essayer:

1) lire des fichiers audio sur le fond de la file d'attente:

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

2) Déplacez le code que vous avez dans viewDidAppear (prepareToPlay())viewDidLoad. Je suppose que ce sera une suggestion moins utile puisque 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 essayez ceux-ci et le retard est encore trop, vous pourriez tout simplement avoir à utiliser quelque chose d'autre que AVAudioPlayer, comme OpenAL.

6
répondu mmd1080 2017-05-23 03:32:59