首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >同时录制视频和播放音频

同时录制视频和播放音频
EN

Stack Overflow用户
提问于 2017-05-18 14:53:48
回答 1查看 2.6K关注 0票数 17

我想同时录制视频和播放音频。当开始录制视频时,预先加载的音频开始播放,当停止视频录制时,音频也停止播放。

我尝试使用第三方库"SwiftyCam“(https://github.com/Awalz/SwiftyCam)录制视频,并在start写入视频录制文件时使用委托方法开始播放音频。

主ViewCOntroller代码如下:

代码语言:javascript
复制
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库:

代码语言:javascript
复制
/**

    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)

EN

回答 1

Stack Overflow用户

发布于 2017-05-23 11:33:00

有几件事你可以试试:

1)后台队列播放音频:

代码语言:javascript
复制
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUN‌​D, 0)) {
    self.player.play()
}

2)将您在viewDidAppear (包括prepareToPlay())中的代码移至viewDidLoad。我认为这将是一个不太有用的建议,因为播放是由用户发起的,但在prepareToPlay()和音频准备就绪之间存在延迟。

如果您尝试了这些方法,但延迟仍然太大,那么您可能只需要使用AVAudioPlayer以外的其他工具,例如OpenAL

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44040604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档