title: Mix video with static image in CALayer using AVVideoCompositionCoreAnimationTool
body: <p>I am trying to mix video, coming from the camera with a static image (watermarking).</p>
  
  <p>I have checked around questions/answers here and some examples, including WWDC AVEditDemo from Apple and ended with the following code.
  Unfortunately, the exported video does not contain the layer with the image.
  Any ideas?</p>
  
  <pre><code>- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
  
  /// incoming video
  NSURL *videoURL = [info valueForKey:UIImagePickerControllerMediaURL];
  
  /// UIImage into CALayer
  UIImage *myImage = [UIImage imageNamed:@"m1h.png"];
  CALayer *aLayer = [CALayer layer];
  aLayer.contents = (id)myImage.CGImage;
  
  AVURLAsset* url = [AVURLAsset URLAssetWithURL:videoURL options:nil];
  AVMutableComposition *videoComposition = [AVMutableComposition composition];
  NSError *error;
  NSFileManager *fileManager = [NSFileManager defaultManager];
  
  AVMutableCompositionTrack *compositionVideoTrack = [videoComposition  addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
  AVAssetTrack *clipVideoTrack = [[url tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
  [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [url duration])  ofTrack:clipVideoTrack atTime:kCMTimeZero error:&amp;error];
  
  AVMutableVideoComposition* videoComp = [[AVMutableVideoComposition videoComposition] retain];
  videoComp.renderSize = CGSizeMake(640, 480);
  videoComp.frameDuration = CMTimeMake(1, 30);
  videoComp.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithAdditionalLayer:aLayer asTrackID:2];
  
  
  /// instruction
  AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
  instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30) );
  AVMutableVideoCompositionLayerInstruction* layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:clipVideoTrack];
  instruction.layerInstructions = [NSArray arrayWithObject:layerInstruction];
  videoComp.instructions = [NSArray arrayWithObject: instruction];
  
  /// outputs
  NSString *filePath = nil;
  filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
  filePath = [filePath stringByAppendingPathComponent:@"temp.mov"]; 
  NSLog(@"exporting to: %@", filePath);
  if ([fileManager fileExistsAtPath:filePath]) 
  {
          BOOL success = [fileManager removeItemAtPath:filePath error:&amp;error];
          if (!success) NSLog(@"FM error: %@", [error localizedDescription]);
  }
  
  /// exporting
  AVAssetExportSession *exporter;
  exporter = [[AVAssetExportSession alloc] initWithAsset:videoComposition presetName:AVAssetExportPresetHighestQuality] ;
  exporter.videoComposition = videoComp;
  exporter.outputURL=[NSURL fileURLWithPath:filePath];
  exporter.outputFileType=AVFileTypeQuickTimeMovie;
  
  [statusLabel setText:@"processing..."];
  
  [exporter exportAsynchronouslyWithCompletionHandler:^(void){
      switch (exporter.status) {
          case AVAssetExportSessionStatusFailed:
              NSLog(@"exporting failed");
              break;
          case AVAssetExportSessionStatusCompleted:
              NSLog(@"exporting completed");
              UISaveVideoAtPathToSavedPhotosAlbum(filePath, self, @selector(video:didFinishSavingWithError:contextInfo:), NULL);
              break;
          case AVAssetExportSessionStatusCancelled:
              NSLog(@"export cancelled");
              break;
      }
  }];
  </code></pre>
  
  <p>}</p>