Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- func newMergeMethod(arrayVideo:[AVAsset], completion:@escaping Completion) -> Void {
- var arrayLayerInstructions:[AVMutableVideoCompositionLayerInstruction] = []
- let mainComposition = AVMutableComposition()
- let compositionVideoTrack = mainComposition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)
- let soundtrackTrack = mainComposition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)
- var insertTime = kCMTimeZero
- for videoAsset1 in arrayVideo{
- try! compositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset1.duration), of: videoAsset1.tracks(withMediaType: AVMediaTypeVideo)[0], at: insertTime)
- compositionVideoTrack.preferredTransform = videoAsset1.preferredTransform
- let duration = videoAsset1.duration
- // Add instruction for video track
- let layerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: compositionVideoTrack)
- let endTime = CMTimeAdd(insertTime, duration)
- let timeScale = videoAsset1.duration.timescale
- let durationAnimation = CMTime.init(seconds: 1, preferredTimescale: timeScale)
- layerInstruction.setOpacityRamp (fromStartOpacity: 1.0, toEndOpacity: 0.0, timeRange: CMTimeRange.init(start: endTime, duration: durationAnimation))
- arrayLayerInstructions.append(layerInstruction)
- do {
- try soundtrackTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset1.duration), of: videoAsset1.tracks(withMediaType: AVMediaTypeAudio)[0], at: insertTime)
- }
- catch {
- print(error.localizedDescription)
- }
- insertTime = CMTimeAdd(insertTime, videoAsset1.duration)
- }
- let outputFileURL = URL(fileURLWithPath: NSTemporaryDirectory() + "merge.mp4")
- let fileManager = FileManager()
- fileManager.removeItemIfExisted(outputFileURL)
- // Main video composition instruction
- let mainInstruction = AVMutableVideoCompositionInstruction()
- mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, insertTime)
- mainInstruction.layerInstructions = arrayLayerInstructions
- // Main video composition
- let mainComposition1 = AVMutableVideoComposition()
- mainComposition1.instructions = [mainInstruction]
- mainComposition1.frameDuration = CMTimeMake(1, 30)
- mainComposition1.renderSize = CGSize(width: 1280, height: 720)
- let exporter = AVAssetExportSession(asset: mainComposition, presetName: AVAssetExportPresetHighestQuality)
- exporter?.outputURL = outputFileURL
- exporter?.outputFileType = AVFileTypeMPEG4
- exporter?.shouldOptimizeForNetworkUse = true
- exporter?.videoComposition = mainComposition1
- exporter?.exportAsynchronously(completionHandler: {
- DispatchQueue.main.async { _ in
- self.exportDidFinish(exporter!)
- }
- })
- }
Add Comment
Please, Sign In to add comment