2015-10-07 4 views
0

J'ai un AVMutableComposition fabriqué à partir d'une vidéo Slo-Mo. Dans AVPlayer, il joue à la bonne vitesse, parce que je l'ai demandé à Photos en utilisant PHVideoRequestOptions.Original qui n'inclut pas la partie Slo-Mo pour la vidéo. Cependant, l'exportation de la composition mutable l'exportera avec FPS complet, ce qui provoque le retour du Slo-Mo si le FPS est trop élevé.Enregistrement de vidéos Slo-Mo en FPS normal

Comment exporter une vidéo avec une fréquence d'images de 30? Existe-t-il un type de fichier spécifique qui n'inclut pas le ralenti ou un autre moyen de le faire?

Deux (mauvaises) solutions que j'ai trouvé:

  1. Réglage AVAssetExportSession-AVAssetExportPresetMediumQuality ou moins causeront le taux de trame de baisse, mais la qualité sera également pire. Pas bon.
  2. La définition AVAssetExportSession.videoComposition d'une composition vidéo avec frameDuration est CMTimeMake(1, 30) mais cela prend vraiment beaucoup de temps pour exporter la vidéo, ce qui n'est pas bon non plus. Je ne sais pas ce qui le fait prendre si longtemps.

Répondre

2

Selon Apple DTS, actuellement la meilleure solution est celle que je mentionné que le numéro 2. Ici, il est plus en détail:

 let videoComposition = AVMutableVideoComposition(propertiesOfAsset: mutableComposition) 
     videoComposition.frameDuration = CMTimeMake(1, 30) // Changes FPS to 30 

     let exportSession = AVAssetExportSession(asset: mutableComposition, presetName: AVAssetExportPresetHighestQuality) 

     exportSession?.videoComposition = videoComposition 

     exportSession?.outputURL = temporaryURL 
     exportSession?.outputFileType = AVFileTypeMPEG4      

     exportSession?.exportAsynchronouslyWithCompletionHandler({ 
      // Handling the export 
     }) 

Exportation avec la composition vidéo semble prendre beaucoup plus de temps qu'il ne sans cela, mais j'ai déposé une demande d'enchantement sur l'amélioration de cette situation comme suggéré par Apple DTS.

+1

Cela a fonctionné pour moi. Il n'y a qu'une petite erreur dans le code: 'videoComposition = CMTimeMake (1, 30) // Change FPS à 30' devrait être' videoComposition.frameDuration = CMTimeMake (1, 30) ' –

+0

@RuudVisser merci de l'avoir signalé! Peut-être sauve quelqu'un de la frustration. :) – alkku