Enregistrement vidéo et lecture audio en même temps ios
je veux enregistrer la vidéo et lire l'audio simultanément. lorsque vous commencez l'enregistrement vidéo, l'audio préchargé commencer la lecture et lorsque vous arrêtez l'enregistrement vidéo, l'audio s'arrête également la lecture.
j'ai essayé D'enregistrer la vidéo en utilisant la bibliothèque de tiers " SwiftyCam" (https://github.com/Awalz/SwiftyCam) et commencer à jouer l'audio dans la méthode delegate quand commence écrit le dossier d'enregistrement vidéo.
le code du contrôleur de la vue principale est ci-dessous :
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()
}
}
bibliothèque 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()
}
}
}
problème: il arrive parfois que l'on retarde la lecture de l'audio en microseconde. quand l'audio commence la lecture et l'enregistrement sonore dans l'enregistrement vidéo un certain temps de synchronisation propre et un certain temps de retard dans le son.
je vérifie avec l'audio de fusion avec l'audio d'origine et il y a un certain retard comme montré ci-dessous l'image. le problème n'est pas toujours, mais un retard aléatoire et non synchronisation.
sont toutes les solutions? comment faire pour enregistrer la vidéo et lire l'audio en même temps (sur un simple clic de bouton) Démarrer et pas de retard et pas de problème de synchronisation? un autre moyen?
pour lire des fichiers audio utilisés: AVAudioPlayer
pour enregistrer de la vidéo utilisée : Swiftycam (AVCaptureSession)
1 réponses
Quelques chose que vous pouvez essayer:
1) lire des fichiers audio sur le fond de la file d'attente:
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
self.player.play()
}
2) Déplacez le code que vous avez dans viewDidAppear
(prepareToPlay()
)viewDidLoad
. Je suppose que ce sera une suggestion moins utile puisque la lecture est initiée par l'utilisateur mais il y a un délai entre prepareToPlay()
et quand votre audio est prêt.
si vous essayez ceux-ci et le retard est encore trop, vous pourriez tout simplement avoir à utiliser quelque chose d'autre que AVAudioPlayer
, comme OpenAL
.