sonido reproduce porque pantalla musica mientras interno grabo grabar grabacion graba escucha cuando con como ios swift swift3 avaudioplayer video-capture

ios - reproduce - iphone graba sin sonido



Grabar video y reproducir audio al mismo tiempo ios (1)

Quiero grabar video y reproducir audio simultáneamente. cuando se inicia la grabación de video, se inicia la reproducción de audio precargado y cuando se detiene la grabación de video, el audio también se detiene.

Intenté grabar el video utilizando la biblioteca de terceros " SwiftyCam " ( https://github.com/Awalz/SwiftyCam ) y comenzar a reproducir audio en el método de delegado cuando el inicio escribe el archivo de grabación de video.

El código principal de ViewControlador está abajo:

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

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

problema: a veces hay un retraso en comenzar a reproducir audio en un microsegundo. cuando el audio comienza a reproducirse y el sonido se graba en la grabación de video, la sincronización es correcta y el retardo del sonido.

Lo compruebo con audio de fusión con audio original y hay un cierto retraso, como se muestra a continuación en la imagen. El problema no es siempre sino un retraso aleatorio y no se sincroniza.

¿Hay alguna solución? ¿Cómo grabar, reproducir y reproducir audio al mismo tiempo (con solo presionar un botón) iniciar y no demora y no hay problema de sincronización? es de otra manera?

Para reproducir el audio utilizado: AVAudioPlayer

Para grabar el video utilizado: Swiftycam (AVCaptureSession)


Una cosa de pareja que puedes probar:

1) Reproducir audio en la cola de fondo:

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

2) Mueva el código que tiene en viewDidAppear (incluido prepareToPlay() ) para viewDidLoad . Supongo que esto será una sugerencia menos útil ya que la reproducción es iniciada por el usuario, pero hay un retraso entre prepareToPlay() y cuando el audio está listo.

Si intenta estos y el retraso es demasiado, simplemente tendrá que usar algo que no sea AVAudioPlayer , como OpenAL .