title: How to combine video clips with different orientation using AVFoundation
body: <p>I am trying to combine several video clips into one using AVFoundation.
  I can create a single video using AVMutableComposition using the code below </p>
  
  <pre><code>AVMutableComposition *composition = [AVMutableComposition composition];
  
  AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
  
  AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
  
  CMTime startTime = kCMTimeZero;
  
  /*videoClipPaths is a array of paths of the video clips recorded*/
  
  //for loop to combine clips into a single video
  for (NSInteger i=0; i &lt; [videoClipPaths count]; i++) {
  
      NSString *path = (NSString*)[videoClipPaths objectAtIndex:i];
  
      NSURL *url = [[NSURL alloc] initFileURLWithPath:path];
  
      AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
      [url release];
  
      AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
      AVAssetTrack *audioTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
  
      //set the orientation
      if(i == 0)
      {
          [compositionVideoTrack setPreferredTransform:videoTrack.preferredTransform];
      }
  
      ok = [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset duration]) ofTrack:videoTrack atTime:startTime error:nil];
      ok = [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset duration]) ofTrack:audioTrack atTime:startTime error:nil];
  
      startTime = CMTimeAdd(startTime, [asset duration]);
  }
  
  //export the combined video
  NSString *combinedPath = /* path of the combined video*/;
  
  NSURL *url = [[NSURL alloc] initFileURLWithPath: combinedPath];
  
  AVAssetExportSession *exporter = [[[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPreset640x480] autorelease];
  
  exporter.outputURL = url;
  [url release];
  
  exporter.outputFileType = [[exporter supportedFileTypes] objectAtIndex:0];
  
  [exporter exportAsynchronouslyWithCompletionHandler:^(void){[self combineVideoFinished:exporter.outputURL status:exporter.status error:exporter.error];}];
  </code></pre>
  
  <p>The code above works fine if all the video clips were recorded in the same orientation (portrait or landscape). However if I have a mixture of orientations in the clips, the final video will have part of it rotated 90 degrees to the right (or left).</p>
  
  <p>I was wondering is there a way to transform all clips to the same orientation (e.g. the orientation of the first clip) while composing them. From what I read from the XCode document <code>AVMutableVideoCompositionLayerInstruction</code> seems can be used to transform <code>AVAsset</code>, but I am not sure how to create and apply several different layer instruction to corresponding clips and use then in the composition (<code>AVMutableComposition*</code>)</p>
  
  <p>Any help would be appreciated!</p>