title: iOS - Merge two video into single video file with audio
body: <p>I want to merge 2 video files with single file with audio. I am able to merge 2 video files, but after merging ouptut video file does not have any audio sound. Even both old video file have proper audio.I have follow this tutorial: <em><a href="https://www.raywenderlich.com/13418/how-to-play-record-edit-videos-in-ios" rel="nofollow">https://www.raywenderlich.com/13418/how-to-play-record-edit-videos-in-ios</a></em>  Any suggesiton will be great. Thank guys. 
  my code :</p>
  
  <pre><code>- (IBAction)MergeAndSave:(id)sender{
  if(firstAsset !=nil &amp;&amp; secondAsset!=nil){
      [ActivityView startAnimating];
      //Create AVMutableComposition Object.This object will hold our multiple AVMutableCompositionTrack.
      AVMutableComposition* mixComposition = [[AVMutableComposition alloc] init];
  
      //VIDEO TRACK
      AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
      [firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];
  
      AVMutableCompositionTrack *secondTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
      [secondTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, secondAsset.duration) ofTrack:[[secondAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:firstAsset.duration error:nil];
  
      //AUDIO TRACK
      if(audioAsset!=nil){
          AVMutableCompositionTrack *AudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
          [AudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, CMTimeAdd(firstAsset.duration, secondAsset.duration)) ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil];
      } 
  
      AVMutableVideoCompositionInstruction * MainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
      MainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeAdd(firstAsset.duration, secondAsset.duration));
  
      //FIXING ORIENTATION//
      AVMutableVideoCompositionLayerInstruction *FirstlayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:firstTrack];
      AVAssetTrack *FirstAssetTrack = [[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
      UIImageOrientation FirstAssetOrientation_  = UIImageOrientationUp;
      BOOL  isFirstAssetPortrait_  = NO;
      CGAffineTransform firstTransform = FirstAssetTrack.preferredTransform;
      if(firstTransform.a == 0 &amp;&amp; firstTransform.b == 1.0 &amp;&amp; firstTransform.c == -1.0 &amp;&amp; firstTransform.d == 0)  {FirstAssetOrientation_= UIImageOrientationRight; isFirstAssetPortrait_ = YES;}
      if(firstTransform.a == 0 &amp;&amp; firstTransform.b == -1.0 &amp;&amp; firstTransform.c == 1.0 &amp;&amp; firstTransform.d == 0)  {FirstAssetOrientation_ =  UIImageOrientationLeft; isFirstAssetPortrait_ = YES;}
      if(firstTransform.a == 1.0 &amp;&amp; firstTransform.b == 0 &amp;&amp; firstTransform.c == 0 &amp;&amp; firstTransform.d == 1.0)   {FirstAssetOrientation_ =  UIImageOrientationUp;}
      if(firstTransform.a == -1.0 &amp;&amp; firstTransform.b == 0 &amp;&amp; firstTransform.c == 0 &amp;&amp; firstTransform.d == -1.0) {FirstAssetOrientation_ = UIImageOrientationDown;}
      CGFloat FirstAssetScaleToFitRatio = 320.0/FirstAssetTrack.naturalSize.width;
      if(isFirstAssetPortrait_){
          FirstAssetScaleToFitRatio = 320.0/FirstAssetTrack.naturalSize.height;
          CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio);
          [FirstlayerInstruction setTransform:CGAffineTransformConcat(FirstAssetTrack.preferredTransform, FirstAssetScaleFactor) atTime:kCMTimeZero];
      }else{
          CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio);
          [FirstlayerInstruction setTransform:CGAffineTransformConcat(CGAffineTransformConcat(FirstAssetTrack.preferredTransform, FirstAssetScaleFactor),CGAffineTransformMakeTranslation(0, 160)) atTime:kCMTimeZero];
      }
      [FirstlayerInstruction setOpacity:0.0 atTime:firstAsset.duration];
  
      AVMutableVideoCompositionLayerInstruction *SecondlayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:secondTrack];
      AVAssetTrack *SecondAssetTrack = [[secondAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
      UIImageOrientation SecondAssetOrientation_  = UIImageOrientationUp;
      BOOL  isSecondAssetPortrait_  = NO;
      CGAffineTransform secondTransform = SecondAssetTrack.preferredTransform;
      if(secondTransform.a == 0 &amp;&amp; secondTransform.b == 1.0 &amp;&amp; secondTransform.c == -1.0 &amp;&amp; secondTransform.d == 0)  {SecondAssetOrientation_= UIImageOrientationRight; isSecondAssetPortrait_ = YES;}
      if(secondTransform.a == 0 &amp;&amp; secondTransform.b == -1.0 &amp;&amp; secondTransform.c == 1.0 &amp;&amp; secondTransform.d == 0)  {SecondAssetOrientation_ =  UIImageOrientationLeft; isSecondAssetPortrait_ = YES;}
      if(secondTransform.a == 1.0 &amp;&amp; secondTransform.b == 0 &amp;&amp; secondTransform.c == 0 &amp;&amp; secondTransform.d == 1.0)   {SecondAssetOrientation_ =  UIImageOrientationUp;}
      if(secondTransform.a == -1.0 &amp;&amp; secondTransform.b == 0 &amp;&amp; secondTransform.c == 0 &amp;&amp; secondTransform.d == -1.0) {SecondAssetOrientation_ = UIImageOrientationDown;}
      CGFloat SecondAssetScaleToFitRatio = 320.0/SecondAssetTrack.naturalSize.width;
      if(isSecondAssetPortrait_){
          SecondAssetScaleToFitRatio = 320.0/SecondAssetTrack.naturalSize.height;
          CGAffineTransform SecondAssetScaleFactor = CGAffineTransformMakeScale(SecondAssetScaleToFitRatio,SecondAssetScaleToFitRatio);
          [SecondlayerInstruction setTransform:CGAffineTransformConcat(SecondAssetTrack.preferredTransform, SecondAssetScaleFactor) atTime:firstAsset.duration];
      }else{
          ;
          CGAffineTransform SecondAssetScaleFactor = CGAffineTransformMakeScale(SecondAssetScaleToFitRatio,SecondAssetScaleToFitRatio);
          [SecondlayerInstruction setTransform:CGAffineTransformConcat(CGAffineTransformConcat(SecondAssetTrack.preferredTransform, SecondAssetScaleFactor),CGAffineTransformMakeTranslation(0, 160)) atTime:firstAsset.duration];
      }
  
  
      MainInstruction.layerInstructions = [NSArray arrayWithObjects:FirstlayerInstruction,SecondlayerInstruction,nil];;
  
      AVMutableVideoComposition *MainCompositionInst = [AVMutableVideoComposition videoComposition];
      MainCompositionInst.instructions = [NSArray arrayWithObject:MainInstruction];
      MainCompositionInst.frameDuration = CMTimeMake(1, 30);
      MainCompositionInst.renderSize = CGSizeMake(320.0, 480.0);
  
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
      NSString *documentsDirectory = [paths objectAtIndex:0]; 
      NSString *myPathDocs =  [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"mergeVideo-%d.mov",arc4random() % 1000]];
  
      NSURL *url = [NSURL fileURLWithPath:myPathDocs];
  
      AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];
      exporter.outputURL=url;
      exporter.outputFileType = AVFileTypeQuickTimeMovie;
      exporter.videoComposition = MainCompositionInst;
      exporter.shouldOptimizeForNetworkUse = YES;
      [exporter exportAsynchronouslyWithCompletionHandler:^
       {
           dispatch_async(dispatch_get_main_queue(), ^{
               [self exportDidFinish:exporter];
           });
       }];
  }
  </code></pre>
  
  <p>}</p>