Как использовать 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:

_Майк

Другие вопросы по тегам