Guest User

Untitled

a guest
Feb 20th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.76 KB | None | 0 0
  1. if (self.capturedVideos.count != 0) {
  2. //Create AVMutableComposition Object.This object will hold our multiple AVMutableCompositionTrack.
  3. AVMutableComposition* mixComposition = [[AVMutableComposition alloc] init];
  4.  
  5. for (AVAsset *asset in self.capturedVideos) {
  6. //check if the video is the first one captures so that it is placed at time 0.
  7. if ([self.capturedVideos indexOfObject:asset] == 0) {
  8. AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
  9. [firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];
  10. previousAsset = asset;
  11. } else{
  12. AVMutableCompositionTrack *track = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
  13. [track insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:previousAsset.duration error:nil];
  14. previousAsset = asset;
  15. }
  16. }
  17.  
  18. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  19. NSString *documentsDirectory = [paths objectAtIndex:0];
  20. NSString *myPathDocs = [documentsDirectory stringByAppendingPathComponent:
  21. [NSString stringWithFormat:@"mergeVideo-%d.mov",arc4random() % 1000]];
  22. NSURL *url = [NSURL fileURLWithPath:myPathDocs];
  23. // 5 - Create exporter
  24. AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];
  25. exporter.outputURL=url;
  26. exporter.outputFileType = AVFileTypeQuickTimeMovie;
  27. exporter.shouldOptimizeForNetworkUse = YES;
  28. [exporter exportAsynchronouslyWithCompletionHandler:^{
  29. dispatch_async(dispatch_get_main_queue(), ^{
  30. [self exportDidFinish:exporter];
  31. });
  32. }];
  33. }
  34.  
  35. AVMutableComposition *mainComposition = [[AVMutableComposition alloc] init];
  36. AVMutableCompositionTrack *compositionVideoTrack = [mainComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
  37.  
  38.  
  39. AVMutableCompositionTrack *soundtrackTrack = [mainComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
  40. CMTime insertTime = kCMTimeZero;
  41.  
  42. for (AVAsset *videoAsset in assets) {
  43.  
  44. [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:insertTime error:nil];
  45.  
  46. [soundtrackTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:insertTime error:nil];
  47.  
  48. // Updating the insertTime for the next insert
  49. insertTime = CMTimeAdd(insertTime, videoAsset.duration);
  50. }
  51.  
  52. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  53. NSString *documentsDirectory = [paths objectAtIndex:0];
  54.  
  55. // Creating a full path and URL to the exported video
  56. NSString *outputVideoPath = [documentsDirectory stringByAppendingPathComponent:
  57. [NSString stringWithFormat:@"mergeVideo-%d.mov",arc4random() % 1000]];
  58.  
  59. // NSString *documentsDirectory = [paths objectAtIndex:0];
  60. NSString *myPathDocs = [documentsDirectory stringByAppendingPathComponent:
  61. current_name];
  62. NSURL *outptVideoUrl = [NSURL fileURLWithPath:myPathDocs];
  63. AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mainComposition presetName:AVAssetExportPreset640x480];
  64.  
  65. // Setting attributes of the exporter
  66. exporter.outputURL=outptVideoUrl;
  67. exporter.outputFileType =AVFileTypeMPEG4; //AVFileTypeQuickTimeMovie;
  68. exporter.shouldOptimizeForNetworkUse = YES;
  69. [exporter exportAsynchronouslyWithCompletionHandler:^{
  70. dispatch_async(dispatch_get_main_queue(), ^{
  71. //completion(exporter);
  72. [self exportDidFinish:exporter];
  73. // [self exportDidFinish:exporter:assets];
  74. });
  75. }];
  76.  
  77. func merge(arrayVideos:[AVAsset], completion:@escaping (_ exporter: AVAssetExportSession) -> ()) -> Void {
  78.  
  79. let mainComposition = AVMutableComposition()
  80. let compositionVideoTrack = mainComposition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)
  81. compositionVideoTrack?.preferredTransform = CGAffineTransform(rotationAngle: .pi / 2)
  82.  
  83. let soundtrackTrack = mainComposition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid)
  84.  
  85. var insertTime = kCMTimeZero
  86.  
  87. for videoAsset in arrayVideos {
  88. try! compositionVideoTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: videoAsset.tracks(withMediaType: .video)[0], at: insertTime)
  89. try! soundtrackTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: videoAsset.tracks(withMediaType: .audio)[0], at: insertTime)
  90.  
  91. insertTime = CMTimeAdd(insertTime, videoAsset.duration)
  92. }
  93.  
  94. let outputFileURL = URL(fileURLWithPath: NSTemporaryDirectory() + "merge.mp4")
  95.  
  96. let fileManager = FileManager()
  97. fileManager.removeItemIfExisted(outputFileURL)
  98.  
  99. let exporter = AVAssetExportSession(asset: mainComposition, presetName: AVAssetExportPresetHighestQuality)
  100.  
  101. exporter?.outputURL = outputFileURL
  102. exporter?.outputFileType = AVFileType.mp4
  103. exporter?.shouldOptimizeForNetworkUse = true
  104.  
  105. exporter?.exportAsynchronously {
  106. DispatchQueue.main.async {
  107. completion(exporter!)
  108. }
  109. }
  110. }
Add Comment
Please, Sign In to add comment