我有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*/
        });
    }];

}

抱歉,我无法解释我想要什么以及我如何得到。
因此,我从中得出了图表,您可以理解我的问题。

ios - 使用AVFoundation获得裁剪视频的意外结果-LMLPHP
像这张图一样,我想要A的结果是1080 * 1080,但是我得到B的结果是1080 * 1080。
这是屏幕截图,显示结果B的显示方式。
ios - 使用AVFoundation获得裁剪视频的意外结果-LMLPHP

请帮我解决这个问题。
提前致谢。

最佳答案

只需减小视频的x值即可。

CGAffineTransform t1 = CGAffineTransformMakeTranslation(-420, 0);
[layerInstruction setTransform:t1 atTime:kCMTimeZero];

解决了我的问题

关于ios - 使用AVFoundation获得裁剪视频的意外结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33781480/

10-08 21:05