如何使用AVFoundation裁剪video

我正在尝试使用AVFoundation裁剪正在录制的video。 所以我们可以说我创build一个AVCaptureVideoPreviewLayer并设置帧为300×300。

AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession:session]; captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; captureVideoPreviewLayer.delegate = self; captureVideoPreviewLayer.frame = CGRectMake(0,0, 300, 300); [previewView.layer addSublayer:captureVideoPreviewLayer]; 

用户看到裁剪的video。 我想按照用户查看的方式保存video。 使用AVCaptureMovieFileOutput,video显然得到保存而不裁剪。 我正在考虑使用AVCaptureVideoDataOutput来拦截帧并自己裁剪,但是我想知道是否有更高效的方法来实现这一点,或许使用AVExportSession并使用AVVideoComposition。

任何指导将不胜感激。

像这样的东西。 这段代码的99%只是设置自定义CGAffineTransform,然后保存结果。

我假设你想裁剪的video占用输出的全尺寸/宽度 – 例如,一个Scale Affine是正确的解决scheme(放大video,给出裁剪+resize的效果)。

 AVAsset* asset = // your input AVAssetTrack *clipVideoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; AVMutableVideoComposition* videoComposition = [[AVMutableVideoComposition videoComposition]retain]; videoComposition.renderSize = CGSizeMake(320, 240); videoComposition.frameDuration = CMTimeMake(1, 30); AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30) ); AVMutableVideoCompositionLayerInstruction* transformer = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:clipVideoTrack]; CGAffineTransform finalTransform = // setup a transform that grows the video, effectively causing a crop [transformer setTransform:finalTransform atTime:kCMTimeZero]; instruction.layerInstructions = [NSArray arrayWithObject:transformer]; videoComposition.instructions = [NSArray arrayWithObject: instruction]; exporter = [[AVAssetExportSession alloc] initWithAsset:saveComposition presetName:AVAssetExportPresetHighestQuality] ; exporter.videoComposition = videoComposition; exporter.outputURL=url3; exporter.outputFileType=AVFileTypeQuickTimeMovie; [exporter exportAsynchronouslyWithCompletionHandler:^(void){}]; 

ios7添加了一个特定的层指令只是为了裁剪。

 videolayerInstruction setCropRectangle:atTime: 

_麦克风