J'ai implémenté un enregistreur vidéo dans Swift dans le cadre d'une application iOS, où j'ai réglé la durée maxRecordedDuration pour la sortie vidéo à 4 secondes (30 images par seconde):iOS - Swift - Un peu d'audio lorsque l'enregistrement atteint la longueur maximale autorisée
self.videoOutput?.maxRecordedDuration = CMTimeMakeWithSeconds(4, 30)
Lorsque l'utilisateur commence à enregistrer, il y a deux scénarios qui peuvent se produire:
- l'utilisateur décide d'arrêter l'enregistrement avant la durée d'enregistrement maximale est atteinte.
- La durée d'enregistrement maximale est atteinte avant que l'utilisateur arrête l'enregistrement vidéo.
Dans tous les deux cas, les deux
func captureOutput(captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: NSURL!, fromConnections connections: [AnyObject]!)
et
func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!)
sera déclenchée car ils font partie de la AVCaptureFileOutputRecordingDelegate
, qui est chargé de répondre à des événements qui se produisent dans le processus d'enregistrement d'un fichier vidéo (correspondant à la documentation Apple). La sortie vidéo fonctionne parfaitement sans erreur dans le scénario utilisateur 1. Toutefois, dans le scénario utilisateur 2, la sortie vidéo manque certains bits audio. En d'autres termes, à la fin de la vidéo, la vidéo est toujours en cours de lecture alors qu'il n'y a pas de son.
Je suis conscient que lorsque la durée d'enregistrement maximale est atteinte, func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!)
jette l'erreur suivante:
Error Domain=AVFoundationErrorDomain Code=-11810 "Recording Stopped" UserInfo={AVErrorTimeKey=CMTime: {120/30 = 4.000}, AVErrorRecordingSuccessfullyFinishedKey=true, NSLocalizedDescription=Recording Stopped, NSLocalizedFailureReason=The recording reached the maximum allowable length., NSUnderlyingError=0x175324c0 {Error Domain=NSOSStatusErrorDomain Code=-16413 "(null)"}}
J'ai ajouté un code au début de la méthode pour vérifier si l'enregistrement a été encore terminé avec succès lorsque cela erreur sera lancé:
// Error during video recording
if let error = error, let finishedSuccessful = error.userInfo[ AVFoundation.AVErrorRecordingSuccessfullyFinishedKey ] as? Bool
{
// Video was not successfully recorded
if !finishedSuccessful
{
return
}
}
Même si le code fonctionne comme prévu, le résultat vidéo a une audio manquant à la fin comme mentionné ci-dessus. Je me demandais s'il y avait un moyen de réparer ce bug?
Le problème avec ceci est que le retard n'est pas exact et étrangement non plus maxrecordedduration. Connaissez-vous une autre méthode EXACT pour l'arrêter exactement comme 8.0 au lieu de 8.5366666? Même les temporisateurs ne sont pas exacts ... – simplexity
@simplexity est probablement une mauvaise idée, mais peut-être que vous pouvez exécuter le timer jusqu'à 1 seconde avant qu'il ne se termine et avoir un script de 0.01s delay en cours d'exécution et vérifier s'il doit exécuter stopRecording(). Si quelque chose, cela devrait vous rapprocher du temps que vous voulez vraiment – budidino
Merci. Cela m'a conduit dans la bonne direction. – simplexity