Как использовать AVFoundation для обрезки видео
Я пытаюсь использовать AVFoundation для обрезки видео, которое я записываю. Допустим, я создал AVCaptureVideoPreviewLayer и установил кадр 300x300.
AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];
captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
captureVideoPreviewLayer.delegate = self;
captureVideoPreviewLayer.frame = CGRectMake(0,0, 300, 300);
[previewView.layer addSublayer:captureVideoPreviewLayer];
Пользователь видит обрезанное видео. Я хотел бы сохранить видео именно так, как его просматривает пользователь. Используя AVCaptureMovieFileOutput, видео очевидно сохраняется без обрезки. Я подумывал об использовании AVCaptureVideoDataOutput для перехвата кадров и обрезки их сам, но мне было интересно, есть ли более эффективный способ сделать это, возможно, с AVExportSession и использованием AVVideoComposition.
Любое руководство будет оценено.
2 ответа
Примерно так. 99% этого кода просто настраивает его на выполнение пользовательского CGAffineTransform, а затем сохраняет результат.
Я предполагаю, что вы хотите, чтобы обрезанное видео занимало полный размер / ширину вывода - так что, например, Scale Affine - правильное решение (вы увеличиваете видео, давая эффект обрезки + изменения размера).
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 добавил специальную инструкцию Layer только для обрезки.
videolayerInstruction setCropRectangle:atTime:
_Майк