2

ビデオ ファイルから CGRect の特定の領域をトリミングしたいと考えています。このチュートリアルに従いました。

renderSizeのプロパティを使用AVMutableVideoCompositionして、指定されたサイズを取得しています。ビデオを指定したサイズにトリミングするために使用するコードを次に示します。

- (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);

     });
 }];
 }

私の元のビデオはこのようなものです。画像

応募後の私の動画renderSizeAVMutableVideoCompositionこんな感じです。画像

ご覧のとおり、元のビデオから下の部分が正常に切り取られています。

サイズのあるビデオがあり、そのビデオ(1000,1000)の中央部分(500,500)の領域のみが必要だとしましょう。だから私のCGrectだろう(0,250,500,500)。私の場合、画像が存在する領域のみが必要なため、トップバーとボトムバーを切り取りたいと考えています。

だから私はこのように応募CGAffineTransformしましたAVMutableVideoCompositionLayerInstruction

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

この下の画像のようになりました。

画像

では、ビデオのトリミングにこの値を適用するにはどうすればよい(x,y)ですか。ここで何が間違っていますか。助けていただければ幸いです。

4

0 に答える 0