我有1920 * 1080(16:9)的视频,我想以1080 * 1080(1:1)的中间像素裁剪该视频。 为此我写了下面的代码。
-(void)cropVideo
{
AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init];
AVMutableCompositionTrack *track = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack *track1 = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
NSString *path = [NSString stringWithFormat:@"%@/staticVideo.mp4", [[NSBundle mainBundle] resourcePath]];
AVAsset *asset = [AVAsset assetWithURL:[NSURL fileURLWithPath:path]];
[track insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:CMTimeMake(0, 1) error:nil];
[track1 insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:[[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:CMTimeMake(0, 1) error:nil];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *myPathDocs = [documentsDirectory stringByAppendingPathComponent:
[NSString stringWithFormat:@"%@1x1.mov",NSBundle.mainBundle.infoDictionary[@"CFBundleExecutable"]]];
[[NSFileManager defaultManager] removeItemAtPath:myPathDocs error:nil];
NSURL *url = [NSURL fileURLWithPath:myPathDocs];
/** code for crop video*/
AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration);
AVMutableVideoCompositionLayerInstruction *layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:track];
[layerInstruction setCropRectangle:CGRectMake(420, 0, 1080, 1080) atTime:kCMTimeZero];
[layerInstruction setOpacity:0.0 atTime:asset.duration];
instruction.layerInstructions = [NSArray arrayWithObjects:layerInstruction,nil];
AVMutableVideoComposition *mainCompositionInst = [AVMutableVideoComposition videoComposition];
mainCompositionInst.renderSize = CGSizeMake(1080, 1080);
mainCompositionInst.instructions = [NSArray arrayWithObject:instruction];
mainCompositionInst.frameDuration = CMTimeMake(1, 30);
/** code for crop video*/
AVAssetExportSession *exporter;
int currentSize = (int) [[NSUserDefaults standardUserDefaults] integerForKey:@"VideoSize"];
if (currentSize == 1)
{
exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPreset640x480];
}
else if (currentSize == 2)
{
exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPreset1280x720];
}
else if (currentSize == 3)
{
exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPreset1920x1080];
}
else if (currentSize == 4)
{
exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPreset3840x2160];
}
exporter.videoComposition = mainCompositionInst;
exporter.outputURL=url;
exporter.outputFileType = AVFileTypeQuickTimeMovie;
exporter.shouldOptimizeForNetworkUse = YES;
[exporter exportAsynchronouslyWithCompletionHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
/*update Video*/
});
}];
}
抱歉,我无法解释我的想法以及我的收获方式。
所以我从中提取了图表,你可以理解我的问题。
如图所示,我希望得到80 * 1080的A结果但是我得到了B * 1080 * 1080的结果。
以下是结果B出现的截图。
请帮我解决这个问题。 提前谢谢。
答案 0 :(得分:0)
只需减少视频的x值。
CGAffineTransform t1 = CGAffineTransformMakeTranslation(-420, 0);
[layerInstruction setTransform:t1 atTime:kCMTimeZero];
解决了我的问题...