web-dev-qa-db-ja.com

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を使用して、これを行うより効率的な方法があるかどうか疑問に思いました。

任意のガイダンスをいただければ幸いです。

23
haider

このようなもの。このコードの99%は、カスタムCGAffineTransformを実行するように設定し、結果を保存するだけです。

トリミングされたビデオが出力のフルサイズ/幅を占めるようにすることを想定しています-たとえば、スケールアフィンが正しい解決策です(ビデオを拡大すると、トリミング+サイズ変更された効果が得られます)。

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){}];
28
Adam

ios7は、トリミングのためだけに特定のレイヤー命令を追加しました。

videolayerInstruction setCropRectangle:atTime:

_マイク

10
nibeck