Le code ci-dessous exporte une video à l'aide de AVMutableComposition
. Mais dans la video exscope, si vous souhaitez qu'une image s'affiche pendant 3 secondes après la fin de la video source, existe-t-il un moyen de le faire avec AVMutableCompositionTrack
ou devez-vous append un calque d'image et animer son apparence après la fin de la video?
Finalement, l'objective est de merge un nombre arbitraire d'images et de videos dans une video principale.
Malheureusement, lors des tests, il semble que AVVideoCompositionCoreAnimationTool
ralentisse sérieusement le process d'export (de <1 seconde à 10-20 secondes), donc le but est d'éviter AVVideoCompositionCoreAnimationTool
si possible.
// Create composition object let composition = AVMutableComposition() let compositionVideoTrack = composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID(kCMPersistentTrackID_Invalid)) let compositionAudioTrack = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID(kCMPersistentTrackID_Invalid)) var insertTime = kCMTimeZero // Extract tracks from slice video let videoURL = NSURL(fileURLWithPath: videoPath) let videoAsset = AVURLAsset(URL: videoURL, options: nil) let sourceVideoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0] let sourceAudioTrack = videoAsset.tracksWithMediaType(AVMediaTypeAudio)[0] do { try compositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), ofTrack: sourceVideoTrack, atTime: kCMTimeZero) try compositionAudioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), ofTrack: sourceAudioTrack, atTime: kCMTimeZero) } catch { print("Error with insertTimeRange while exporting video: \(error)") } // Export composition to video let outputURL = getFilePath(getUniqueFilename(gMP4File)) let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality) exporter!.outputURL = NSURL(fileURLWithPath: outputURL) exporter!.outputFileType = AVFileTypeMPEG4 exporter!.exportAsynchronouslyWithCompletionHandler({ self.exportDidFinish(exporter!) })
Après avoir consulté d'autres personnes sur le SO et effectué d'autres searchs sur le Web, il semble que ce ne soit pas possible. La fusion d'une image avec une video dans une video principale jouable depuis une application semble nécessiter AVVideoCompositionCoreAnimationTool.