Jak używać AVFoundation do kadrowania wideo

Próbuję użyć AVFoundation do przycinania filmów, które nagrywam. Powiedzmy więc, że stworzyłem AVCaptureVideoPreviewLayer i ustawiłem ramkę na 300x300.

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

Użytkownik widzi kadrowane wideo. Chciałbym zapisać film dokładnie tak, jak ogląda go użytkownik. Używając AVCaptureMovieFileOutput, wideo jest oczywiście zapisywane bez kadrowania. Rozważałem użycie AVCaptureVideoDataOutput do przechwytywania ramek i przycinania ich osobiście, ale zastanawiałem się, czy jest bardziej wydajny sposób, aby to zrobić, być może z AVExportSession i za pomocą AVVideoComposition.

Wszelkie wskazówki będą mile widziane.

Author: haider, 2011-03-04

2 answers

Coś takiego. 99% tego kodu po prostu ustawia go, aby wykonać niestandardowy CGAffineTransform, a następnie zapisać wynik.

Zakładam, że chcesz, aby kadrowany film zajmował Pełny rozmiar / Szerokość wyjścia - tak, że np. Skala affinis jest właściwym rozwiązaniem(powiększasz wideo, dając efekt kadrowania + zmiany rozmiaru).

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){}];
 29
Author: Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-05 08:15:37

Ios7 dodał specjalną instrukcję warstwy tylko do kadrowania.

videolayerInstruction setCropRectangle:atTime:

_mike

 9
Author: nibeck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-25 18:58:02