【发布时间】:2017-10-17 20:18:08
【问题描述】:
我想同时录制视频和播放音频。当开始录制视频时,预加载的音频开始播放,当停止视频录制时,音频也停止播放。
我尝试使用第三方库“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)
【问题讨论】:
-
也许你可以试试这个 SO asnwer:stackoverflow.com/a/36912798/2859764
-
@AkshitZaveri,,, 我可以同时播放音频和录制视频。单击单个按钮开始音频播放和视频录制开始。但问题是播放音频延迟 0.5 秒(并非总是如此)。
-
理论上我认为这是可能的,但不知道如何同步这两个任务。希望有人会向我们展示优雅的解决方案
-
您是想在录制时只听音频,还是想在视频中添加一些背景音乐?如果您想添加背景音乐而不是您可以尝试使用
AVMutableCompositionTrack以编程方式合并视频中的音轨,您可以向其中添加音乐,我有一个类似的任务,我将音频合并到视频中,最后导出了视频@BhargavB.Bajani -
@dhiru... 我正在同时开始视频录制和音频播放。视频中的音频录音。之后,当我将播放的音频与录制的视频音频进行比较时,它不同步。
标签: ios swift swift3 avaudioplayer video-capture