Cropping a specified CGRect from a video in ios

561 Views Asked by At

I want to crop a specified region of CGRect from my video file. I followed this Tutorial .

I'm using renderSize property of AVMutableVideoComposition to get to a specified size. Here is my code that I use to crop a video to a specified size.

- (void) cropVideoAtPath:(NSString *) path
{
  //load our movie Asset
  AVAsset *asset = [AVAsset assetWithURL:[NSURL fileURLWithPath:path]];

  //create an avassetrack with our asset
  AVAssetTrack *clipVideoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

  //create a video composition and preset some settings
  AVMutableVideoComposition* videoComposition = [AVMutableVideoComposition videoComposition];
  videoComposition.frameDuration = CMTimeMake(1, 30);
  //here we are setting its render size to its height x height (Square)

  float deltaHeight = 100;

  videoComposition.renderSize = CGSizeMake(clipVideoTrack.naturalSize.width, clipVideoTrack.naturalSize.height-deltaHeight);

 //create a video instruction
  AVMutableVideoCompositionInstruction *instruction = 
 [AVMutableVideoCompositionInstruction videoCompositionInstruction];
  instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30));

AVMutableVideoCompositionLayerInstruction* transformer [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:clipVideoTrack];

 //    CGAffineTransform t1 = CGAffineTransformMakeTranslation(0, 1000);
 //    CGAffineTransform finalTransform = t1;
 //    [transformer setTransform:finalTransform atTime:kCMTimeZero];

instruction.layerInstructions = [NSArray arrayWithObject:transformer];
videoComposition.instructions = [NSArray arrayWithObject: instruction];

//Create an Export Path to store the cropped video
NSString * documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *exportPathLoc = [documentsPath stringByAppendingFormat:@"/CroppedVideo.mp4"];
NSURL *exportUrl = [NSURL fileURLWithPath:exportPathLoc];

//Remove any prevouis videos at that path
[[NSFileManager defaultManager]  removeItemAtURL:exportUrl error:nil];

//Export
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality] ;
exporter.videoComposition = videoComposition;
exporter.outputURL = exportUrl;
exporter.outputFileType = AVFileTypeQuickTimeMovie;

[exporter exportAsynchronouslyWithCompletionHandler:^
 {
     dispatch_async(dispatch_get_main_queue(), ^{

         NSLog(@"Saved");
         UISaveVideoAtPathToSavedPhotosAlbum([[exporter outputURL] path],nil,nil,nil);

     });
 }];
 }

My original video look like this one. Image

My video after applying renderSize to AVMutableVideoComposition look like this one. Image

As we can see bottom portion are successfully clipped away from original video.

Lets say I have a video with size (1000,1000) and I want only the center portion (500,500) region of that video. So my CGrect would be (0,250,500,500). In my case I want only the region where image is present and so I want to crop out top bar and bottom bar.

So I applied CGAffineTransform to the AVMutableVideoCompositionLayerInstruction like this

CGAffineTransform t1 = CGAffineTransformMakeTranslation(0, deltaHeight);
CGAffineTransform finalTransform = t1;
[transformer setTransform:finalTransform atTime:kCMTimeZero];

which resulted like this below image.

Image

So how can I apply this (x,y) value in cropping the video and what am I doing wrong in here . I would appreciate any help.

0

There are 0 best solutions below