Подтвердить что ты не робот

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

Любое руководство будет оценено.

4b9b3361

Ответ 1

Вот так. 99% этого кода просто устанавливает его для создания пользовательской CGAffineTransform и затем сохраняет результат.

Я предполагаю, что вы хотите, чтобы обрезанное видео занимало полный размер/ширину вывода, так что, например, масштабирование 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){}];

Ответ 2

ios7 добавила определенную команду Layer только для обрезки.

videolayerInstruction setCropRectangle:atTime:

_mike