Guest User

Untitled

a guest
Jul 19th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.04 KB | None | 0 0
  1. func newMergeMethod(arrayVideo:[AVAsset], completion:@escaping Completion) -> Void {
  2.  
  3. var arrayLayerInstructions:[AVMutableVideoCompositionLayerInstruction] = []
  4. let mainComposition = AVMutableComposition()
  5. let compositionVideoTrack = mainComposition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)
  6.  
  7. let soundtrackTrack = mainComposition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)
  8.  
  9. var insertTime = kCMTimeZero
  10.  
  11. for videoAsset1 in arrayVideo{
  12. try! compositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset1.duration), of: videoAsset1.tracks(withMediaType: AVMediaTypeVideo)[0], at: insertTime)
  13.  
  14. compositionVideoTrack.preferredTransform = videoAsset1.preferredTransform
  15.  
  16. let duration = videoAsset1.duration
  17.  
  18. // Add instruction for video track
  19. let layerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: compositionVideoTrack)
  20.  
  21. let endTime = CMTimeAdd(insertTime, duration)
  22.  
  23. let timeScale = videoAsset1.duration.timescale
  24. let durationAnimation = CMTime.init(seconds: 1, preferredTimescale: timeScale)
  25.  
  26. layerInstruction.setOpacityRamp (fromStartOpacity: 1.0, toEndOpacity: 0.0, timeRange: CMTimeRange.init(start: endTime, duration: durationAnimation))
  27.  
  28. arrayLayerInstructions.append(layerInstruction)
  29.  
  30.  
  31. do {
  32. try soundtrackTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset1.duration), of: videoAsset1.tracks(withMediaType: AVMediaTypeAudio)[0], at: insertTime)
  33. }
  34. catch {
  35. print(error.localizedDescription)
  36. }
  37.  
  38. insertTime = CMTimeAdd(insertTime, videoAsset1.duration)
  39. }
  40.  
  41.  
  42. let outputFileURL = URL(fileURLWithPath: NSTemporaryDirectory() + "merge.mp4")
  43.  
  44. let fileManager = FileManager()
  45. fileManager.removeItemIfExisted(outputFileURL)
  46.  
  47.  
  48. // Main video composition instruction
  49. let mainInstruction = AVMutableVideoCompositionInstruction()
  50. mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, insertTime)
  51. mainInstruction.layerInstructions = arrayLayerInstructions
  52.  
  53. // Main video composition
  54. let mainComposition1 = AVMutableVideoComposition()
  55. mainComposition1.instructions = [mainInstruction]
  56. mainComposition1.frameDuration = CMTimeMake(1, 30)
  57. mainComposition1.renderSize = CGSize(width: 1280, height: 720)
  58.  
  59. let exporter = AVAssetExportSession(asset: mainComposition, presetName: AVAssetExportPresetHighestQuality)
  60.  
  61. exporter?.outputURL = outputFileURL
  62. exporter?.outputFileType = AVFileTypeMPEG4
  63. exporter?.shouldOptimizeForNetworkUse = true
  64. exporter?.videoComposition = mainComposition1
  65.  
  66. exporter?.exportAsynchronously(completionHandler: {
  67. DispatchQueue.main.async { _ in
  68. self.exportDidFinish(exporter!)
  69. }
  70. })
  71. }
Add Comment
Please, Sign In to add comment