2017-05-18 1 views
17

비디오를 녹화하고 동시에 오디오를 재생하고 싶습니다. 비디오 녹화를 시작하면 사전로드 된 오디오가 재생을 시작하고 비디오 녹화를 중지하면 오디오도 재생을 중지합니다. 동시에 비디오 녹화 및 오디오 재생 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() 
      } 
     } 
    } 

문제 : 때때로 마이크로 오디오 재생을 시작 지연을 받고. 음성 녹음이 시작되고 비디오 녹음의 사운드 녹음이 제대로 동기화되고 사운드가 약간 지연됩니다.

원본 오디오와 병합 오디오로 확인하고 아래 그림과 같이 약간의 지연이 있습니다. 문제는 항상 랜덤 지연이 아니며 동기화되지 않습니다. enter image description here

enter image description here 은 어떤 해결책입니까? 한 번에 한 번의 클릭으로 비디오 녹화 및 오디오 재생을 시작하고 지연이없고 동기화 문제가 발생하지 않습니까? 은 다른 방법일까요? 사용 기록 비디오 AVAudioPlayer

: 사용 플레이 오디오

Swiftycam (AVCaptureSession)

+0

이 시도해 볼 수도 있습니다. http://stackoverflow.com/a/36912798/2859764 –

+0

@AkshitZaveri ,,, 나는 오디오와 비디오를 동시에 재생할 수 있습니다. 클릭 한 번으로 오디오 재생 및 비디오 녹화가 시작됩니다. 하지만 문제는 오디오 재생이 0.5 초 지연된다는 것입니다 (항상 그렇지는 않음). –

+1

이론적으로 나는 가능하다고 생각하지만,이 두 가지 작업을 어떻게 동기화 시킬지 전혀 모릅니다. 누군가가 우리에게 우아한 해결책을 보여줄 수 있기를 바랍니다. – sage444

답변

6

커플 것은 당신이 시도 할 수 있습니다 :

1) 배경 큐에 오디오를 재생 :

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

2) viewDidAppear (prepareToPlay() 포함)의 코드를 viewDidLoad으로 옮깁니다. 나는이 방법이 덜 도움이 될 것이라고 생각합니다. 왜냐하면 연주는 사용자가 시작했기 때문이며, prepareToPlay()과 오디오가 준비 될 때 사이에 지연이 있습니다.

지연 시간이 너무 길면 OpenAL과 같이 AVAudioPlayer 이외의 값을 사용해야 할 수 있습니다.

+0

"viewDidAppear"에서 "viewDidLoad"로 이동 코드를 시도했습니다. 또한 prepareToPlay() -> play() -> pause() –

관련 문제