AVFoundation:在Swift上为视频添加logoImage

时间:2015-08-05 02:53:15

标签: ios swift avfoundation

我想在swift中创建一个视频编辑应用。

我正在创建一个向视频添加logoImage的功能。我找到了用objective-c编写的示例代码。但我找不到用swift编写的相同示例代码。

我尝试将objective-c示例代码转换为swift,但没有成功。

我想获得用swift编写的示例代码。

它显示示例代码作为参考。

#pragma marks - AVCaptureFileOutputRecordingDelegate methods


- (void)captureOutput:(AVCaptureFileOutput *)captureOutput
didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL
fromConnections:(NSArray *)connections
error:(NSError *)error
{
  [self compositeMovieFromUrl:outputFileURL];
}


 - (void)compositeMovieFromUrl:(NSURL *)outputFileURL {



   AVURLAsset *videoAsset = [[AVURLAsset alloc] initWithURL:outputFileURL options:nil];


   AVMutableComposition* mixComposition = [AVMutableComposition composition];
   AVMutableCompositionTrack *compositionVideoTrack = 
  [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo
  preferredTrackID:kCMPersistentTrackID_Invalid];
   AVAssetTrack *videoTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];


   [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:videoTrack atTime:kCMTimeZero error:nil];
   [compositionVideoTrack setPreferredTransform:[[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] preferredTransform]];

   UIImage *logoImage = [UIImage imageNamed:@"logo.png"];
   CALayer *logoLayer = [CALayer layer];
   logoLayer.contents = (id) logoImage.CGImage;
   logoLayer.frame = CGRectMake(5, 25, 57, 57); 
   logoLayer.opacity = 0.9; 

   CGSize videoSize = videoTrack.naturalSize;


   CATextLayer *copyrightLayer = [CATextLayer layer];
   copyrightLayer.string = @"kuman.com";
   [copyrightLayer setFont:@"Helvetica"];
   copyrightLayer.fontSize = videoSize.height / 6;
   copyrightLayer.shadowOpacity = 0.5;
   copyrightLayer.alignmentMode = kCAAlignmentCenter;
   copyrightLayer.bounds = CGRectMake(0, 0, videoSize.width, videoSize.height / 6);

   CALayer *parentLayer = [CALayer layer];
   CALayer *videoLayer = [CALayer layer];
       parentLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height);
  videoLayer.frame  = CGRectMake(0, 0, videoSize.width, videoSize.height);
  [parentLayer addSublayer:videoLayer];
  [parentLayer addSublayer:logoLayer];
  [parentLayer addSublayer:copyrightLayer];

  AVMutableVideoComposition* videoComp = [AVMutableVideoComposition  videoComposition];
  videoComp.renderSize = videoSize;
  videoComp.frameDuration = CMTimeMake(1, 30);
  videoComp.animationTool =
    [AVVideoCompositionCoreAnimationTool 
    videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer 
    inLayer:parentLayer];

  AVMutableVideoCompositionInstruction *instruction = 
    [AVMutableVideoCompositionInstruction videoCompositionInstruction];
  instruction.timeRange = CMTimeRangeMake(kCMTimeZero, [mixComposition duration]);
  AVMutableVideoCompositionLayerInstruction* layerInstruction =
    [AVMutableVideoCompositionLayerInstruction 
    videoCompositionLayerInstructionWithAssetTrack:videoTrack];
  instruction.layerInstructions = [NSArray arrayWithObject:layerInstruction];

  videoComp.instructions = [NSArray arrayWithObject: instruction];

  _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition 
     presetName:AVAssetExportPresetMediumQuality];
  _assetExport.videoComposition = videoComp;

  NSString* videoName = @"kuman.mov";
  NSString *exportPath = [NSTemporaryDirectory() stringByAppendingPathComponent:videoName];
  NSURL *exportUrl = [NSURL fileURLWithPath:exportPath];
  _assetExport.outputFileType = AVFileTypeQuickTimeMovie;
  _assetExport.outputURL = exportUrl;
  _assetExport.shouldOptimizeForNetworkUse = YES;

  if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath])
  {
    [[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
  }

  [_assetExport exportAsynchronouslyWithCompletionHandler:
    ^(void ) {

      ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
      if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:exportUrl])
      {
        [library writeVideoAtPathToSavedPhotosAlbum:exportUrl
          completionBlock:^(NSURL *assetURL, NSError *assetError)
          {
            if (assetError) { }
          }];
      }
    }
   ];
 }

0 个答案:

没有答案