Подтвердить что ты не робот

Запись видео и воспроизведение звука одновременно с ios

Я хочу записывать видео и воспроизводить аудио одновременно. при начале записи видео, предустановленном воспроизведении звука и при остановке видеозаписи звук также прекращает воспроизведение.

Я попытался записать видео с помощью сторонней библиотеки " SwiftyCam" (https://github.com/Awalz/SwiftyCam) и начать играть аудио в методе делегата при начале записи файла видеозаписи.

главный код ViewCOntroller ниже:

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:

/**

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

проблема: иногда возникает задержка в начале воспроизведения аудио в микросекунду. при воспроизведении звука и записи звука в видеозаписи, некоторая синхронизация времени и некоторая временная задержка в звуке.

Я проверяю его с помощью слияния аудио с оригинальным звуком, и есть некоторая задержка, как показано ниже. проблема не всегда, но случайная задержка, а не синхронизация. введите описание изображения здесь

введите описание изображения здесь любые решения? как записывать видео и воспроизводить аудио в одно и то же время (при однократном нажатии кнопки), запускать и без задержки, а также не синхронизировать проблему? является любым другим способом?

для используемого аудио воспроизведения: AVAudioPlayer

для используемого видеозаписи: Swiftycam (AVCaptureSession)

4b9b3361

Ответ 1

Пара, которую вы можете попробовать:

1) Воспроизведение аудио в фоновом режиме:

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

2) Переместите код, который у вас есть, в viewDidAppear (включая prepareToPlay()) на viewDidLoad. Я предполагаю, что это будет менее полезным, поскольку игра инициируется пользователем, но есть задержка между prepareToPlay() и когда ваш звук готов.

Если вы попробуете их, и задержка по-прежнему слишком велика, вам просто придется использовать что-то другое, кроме AVAudioPlayer, например OpenAL.