title: Merge Two Video files in iPhone Application
body: <p>In One of my application i need to add some image in video. so i cut break video in two part and also make one video from that image. now i want to combine this three video file and make one video file. but i am not get any idea to combine this three video. i see some code over here. but that is not helpful to me. for break video and for make video from image i used below code now i want code to merge this all video.</p>
  
  <p>Any other idea for put current view screen in video file in between.</p>
  
  <p><strong>For break video file</strong></p>
  
  <pre><code>NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Affagogato" ofType:@"mp4"]];
   AVURLAsset *anAsset = [[AVURLAsset alloc] initWithURL:url options:nil];
  
  
  
  
  for(int i = 0; i &lt; 2; i++) {
      AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]
                                             initWithAsset:anAsset presetName:AVAssetExportPresetLowQuality];
      NSString *filePath = nil;
      NSUInteger count = 0;
      do {
          filePath = NSTemporaryDirectory();
  
          NSString *numberString = count &gt; 0 ? [NSString stringWithFormat:@"-%i", count] : @"";
          filePath = [filePath stringByAppendingPathComponent:[NSString stringWithFormat:@"Output-%@.mov", numberString]];
          count++;
      } while([[NSFileManager defaultManager] fileExistsAtPath:filePath]);      
  
      exportSession.outputURL = [NSURL fileURLWithPath:filePath];
      exportSession.outputFileType = AVFileTypeQuickTimeMovie;
      CMTimeRange range;
      if(i == 0){
          CMTime start = CMTimeMakeWithSeconds(0.0, 600);
          CMTime duration = CMTimeMakeWithSeconds(10.0, 600);
          range = CMTimeRangeMake(start, duration);
      }else{
          CMTime start = CMTimeMakeWithSeconds(10.0, 600);
          range = CMTimeRangeMake(start, anAsset.duration);
      }
      exportSession.timeRange = range;   
  
      [exportSession exportAsynchronouslyWithCompletionHandler:^
       {
           dispatch_async(dispatch_get_main_queue(), ^{
               [self exportDidFinish:exportSession Tag:i];
           });
       }]; 
  }
  </code></pre>
  
  <p><strong>Get video from Images</strong></p>
  
  <pre><code>CGRect rect=CGRectMake(0, 0, 320, 480);
  view = [[UIView alloc]initWithFrame:rect];
  
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documentsDirectory = ([paths count] &gt; 0) ? [paths objectAtIndex:0] : nil;
  NSString *path = [documentsDirectory stringByAppendingPathComponent:[@"video2"  stringByAppendingString:@".mov"]];
  
  CGSize size = self.view.frame.size;
  
  
  NSMutableDictionary *attributes = [[NSMutableDictionary alloc]init];
  [attributes setObject:[NSNumber numberWithUnsignedInt:kCVPixelFormatType_32ARGB] forKey:(NSString*)kCVPixelBufferPixelFormatTypeKey];
  [attributes setObject:[NSNumber numberWithUnsignedInt:320] forKey:(NSString*)kCVPixelBufferWidthKey];
  [attributes setObject:[NSNumber numberWithUnsignedInt:480] forKey:(NSString*)kCVPixelBufferHeightKey];
  
  
  NSError *error = nil;
  AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:
                                [NSURL fileURLWithPath:path] fileType:AVFileTypeQuickTimeMovie
                                                            error:&amp;error];
  
  
  NSParameterAssert(videoWriter);
  NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                 AVVideoCodecH264, AVVideoCodecKey,
                                 [NSNumber numberWithInt:size.width], AVVideoWidthKey,
                                 [NSNumber numberWithInt:size.height], AVVideoHeightKey,
                                 nil];
  
  AVAssetWriterInput* writerInput = [[AVAssetWriterInput
                                      assetWriterInputWithMediaType:AVMediaTypeVideo
                                      outputSettings:videoSettings] retain];
  
  
  AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor
                                                   assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput
                                                   sourcePixelBufferAttributes:nil];
  
  
  NSParameterAssert(writerInput);
  NSParameterAssert([videoWriter canAddInput:writerInput]);
  [videoWriter addInput:writerInput];
  
  
  //Start a session:
  [videoWriter startWriting];
  [videoWriter startSessionAtSourceTime:kCMTimeZero];
  
  CVPixelBufferRef buffer = NULL;
  
  //convert uiimage to CGImage.
  
  xPixel=0;
  yPixel=250;
  
  buffer = [self pixelBufferFromCGImage:[[UIImage imageNamed:@"1.jpeg"] CGImage]];
  
  
  
  CVPixelBufferPoolCreatePixelBuffer (NULL, adaptor.pixelBufferPool, &amp;buffer);
  [adaptor appendPixelBuffer:buffer withPresentationTime:kCMTimeZero];
  
  for (int i = 0;i&lt;2; i++)
  {
      if([writerInput isReadyForMoreMediaData])
      {
          //NSLog(@"inside for loop %d",i);
  
          for(int pframetime=1;pframetime&lt;=2;pframetime++)
          {  
  
              CMTime frameTime = CMTimeMake(pframetime,25);
              CMTime lastTime=CMTimeMake(i,1); //i is from 0 to 19 of the loop above
              CMTime presentTime=CMTimeAdd(lastTime, frameTime);
  
              if(i==0)
                  buffer = [self pixelBufferFromCGImage:[[UIImage imageNamed:@"1.jpeg"] CGImage]];
              else
                  buffer = [self pixelBufferFromCGImage:[[UIImage imageNamed:@"2.jpeg"] CGImage]];
              while ( ![writerInput isReadyForMoreMediaData] )
              {
                  [NSThread sleepForTimeInterval:0.05];
              }
  
              [adaptor appendPixelBuffer:buffer withPresentationTime:presentTime];
              i++;
          }
          if(buffer)
              CVBufferRelease(buffer);
          //[NSThread sleepForTimeInterval:0.1];
      }
  }
  [writerInput markAsFinished];
  [videoWriter finishWriting];
  [videoPathArray addObject:path];
  
  //Finish the session:
  
  [videoWriter release];
  [writerInput release];
  CVPixelBufferPoolRelease(adaptor.pixelBufferPool);
  </code></pre>
  
  <p><strong>For Merge video files i try this code but not useful here is some blank screen between video</strong></p>
  
  <pre><code>   AVMutableComposition* mixComposition = [AVMutableComposition composition];
  
      NSString *documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];  
  
      NSString* video_inputFilePath1 = [videoPathArray objectAtIndex:1];
      NSURL*    video_inputFileUrl1 = [NSURL fileURLWithPath:video_inputFilePath1];
  
      NSString* video_inputFilePath2 = [videoPathArray objectAtIndex:0];
      NSURL*    video_inputFileUrl2 = [NSURL fileURLWithPath:video_inputFilePath2];
  
      NSString* video_inputFilePath3 = [videoPathArray objectAtIndex:2];
      NSURL*    video_inputFileUrl3 = [NSURL fileURLWithPath:video_inputFilePath3];
  
      NSString* outputFileName = @"outputFile.mov";
      NSString* outputFilePath = [NSString stringWithFormat:@"%@/%@",documentsDirectoryPath,outputFileName];
  
      NSURL*    outputFileUrl = [NSURL fileURLWithPath:outputFilePath];
  
      if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath]) 
          [[NSFileManager defaultManager] removeItemAtPath:outputFilePath error:nil];
  
      CMTime nextClipStartTime = kCMTimeZero;
  
  
      AVURLAsset* videoAsset1 = [[AVURLAsset alloc]initWithURL:video_inputFileUrl1 options:nil];
      AVURLAsset* videoAsset2 = [[AVURLAsset alloc]initWithURL:video_inputFileUrl2 options:nil];
      AVURLAsset* videoAsset3 = [[AVURLAsset alloc]initWithURL:video_inputFileUrl3 options:nil];
  
  
      CMTimeRange video_timeRange1 = CMTimeRangeMake(kCMTimeZero,videoAsset1.duration);
      AVMutableCompositionTrack *a_compositionVideoTrack1 = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
      [a_compositionVideoTrack1 insertTimeRange:video_timeRange1 ofTrack:[[videoAsset1 tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil];
  
      CMTimeRange video_timeRange3 = CMTimeRangeMake(nextClipStartTime,videoAsset3.duration);
  
      [a_compositionVideoTrack1 insertTimeRange:video_timeRange3 ofTrack:[[videoAsset3 tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:videoAsset1.duration error:nil];
  
      CMTimeRange video_timeRange2 = CMTimeRangeMake(nextClipStartTime,videoAsset1.duration);
      [a_compositionVideoTrack1 insertTimeRange:video_timeRange2 ofTrack:[[videoAsset2 tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:videoAsset1.duration error:nil];
  
  
  
      AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetLowQuality];   
      _assetExport.shouldOptimizeForNetworkUse = YES;
      _assetExport.outputFileType = @"com.apple.quicktime-movie";
      _assetExport.outputURL = outputFileUrl;
  </code></pre>