2016-08-29 2 views
2

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:

  1. l'utilisateur décide d'arrêter l'enregistrement avant la durée d'enregistrement maximale est atteinte.
  2. 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?

Répondre

1

Vous ne savez pas comment corriger le bogue, mais il existe un moyen de l'éviter. Ignorez la fonctionnalité maxRecordedDuration et créez votre propre compte à rebours. De cette façon, vous vous assurez que le scénario 1 est le seul scénario possible.

Il existe plusieurs façons d'y parvenir. Un très simple pourrait être d'effectuer stopRecording() avec un délai de X secondes à partir du moment où l'enregistrement a commencé.

+0

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

+0

@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

+0

Merci. Cela m'a conduit dans la bonne direction. – simplexity