[英]Record Video and play audio at same time 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)
你可以嘗試幾件事:
1)在后台隊列上播放音頻:
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
self.player.play()
}
2)將viewDidAppear
的代碼(包括prepareToPlay()
)移動到viewDidLoad
。 我認為這將是一個不太有用的建議,因為播放是由用戶啟動的,但prepareToPlay()
和音頻准備就緒之間有一個延遲。
如果你嘗試這些並且延遲仍然太多,你可能只需要使用AVAudioPlayer
以外的東西,比如OpenAL
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.