ios – AVAssetExportSession,AVMutableVideoComposition使视频更红

我从livephoto获得了视频,并且更多次导出这样的视频.

它变得比源livephoto更红.这是一个错误?

这是导出代码,最后有一个演示项目.

- (void)clipMovie:(NSString *)path block:(void (^)(BOOL success))completionBlock
    {
        UIColor *bgcolor = (UIColor *)[UIColor blackColor];

        AVURLAsset *videoasset = [[AVURLAsset alloc]initWithURL:[NSURL fileURLWithPath:path] options:nil];

        AVMutableComposition *composition = [AVMutableComposition composition];
        NSError *error;
        [composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoasset.duration) ofAsset:videoasset atTime:kCMTimeZero error:&error];

        AVMutableVideoCompositionInstruction *videoInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
        videoInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, composition.duration);
        videoInstruction.backgroundColor = bgcolor.CGColor;


        if ([[composition tracksWithMediaType:AVMediaTypeVideo] count] > 0)
        {
            AVAssetTrack *videoTrack = [[composition tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

            AVMutableVideoCompositionLayerInstruction *cropLayer = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];

    //        CGSize naturalSize = videoTrack.naturalSize;

            CGSize renderSize = CGSizeMake(1080, 1080);

            AVAssetTrack *videoTracktmp = [[videoasset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
            CGAffineTransform transform = videoTracktmp.preferredTransform;

            CGRect drawrect = CGRectMake(0, 0, 1080, 1080);

            [cropLayer setTransform:transform atTime:kCMTimeZero];

            CALayer *backgroundLayer = [CALayer layer];
            //        [backgroundLayer setContents:(id)self.patternBgView.image.CGImage];
            backgroundLayer.frame = CGRectMake(0, 0, renderSize.width, renderSize.height);
            [backgroundLayer setMasksToBounds:YES];
            backgroundLayer.backgroundColor = bgcolor.CGColor;

            CALayer *videoLayer = [CALayer layer];


            videoLayer.frame =  CGRectMake(drawrect.origin.x, (renderSize.height-drawrect.size.height-drawrect.origin.y), drawrect.size.width, drawrect.size.height);
            CALayer *parentLayer = [CALayer layer];
            parentLayer.frame = CGRectMake(0, 0, renderSize.width, renderSize.height);
            [parentLayer addSublayer:backgroundLayer];
            [parentLayer addSublayer:videoLayer];

            AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
            videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];
            videoInstruction.layerInstructions = @[cropLayer];
            videoComposition.instructions = @[videoInstruction];

            videoComposition.renderSize = CGSizeMake(renderSize.width, renderSize.height);
            videoComposition.frameDuration = CMTimeMake(1, 15);

            AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:videoasset presetName:AVAssetExportPresetHighestQuality];
            exportSession.shouldOptimizeForNetworkUse = YES;
            exportSession.videoComposition = videoComposition;
            //        exportSession.metadata = videoasset.metadata;

            NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"] stringByAppendingPathComponent:@"a"];
            BOOL bo = [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
            NSString *result = [path stringByAppendingPathComponent:@"a.mov"];

            NSString *exportVideoPath = result;
    //        NSLog(@"%@",result);

            if ([[NSFileManager defaultManager] fileExistsAtPath:exportVideoPath]) {
                [[NSFileManager defaultManager] removeItemAtPath:exportVideoPath error:nil];
            }

            NSURL *exportURL = [NSURL fileURLWithPath:exportVideoPath];
            exportSession.outputURL = exportURL;
    //        exportSession.metadata = [self updateMetadata:videoasset.metadata];
            exportSession.outputFileType = AVFileTypeQuickTimeMovie;
            [exportSession exportAsynchronouslyWithCompletionHandler:^{
                dispatch_async(dispatch_get_main_queue(), ^{
                    switch ((int)exportSession.status) {
                        case AVAssetExportSessionStatusFailed:{
                            //                    NSLog (@"FAIL");
                            completionBlock(NO);
                            break;
                        }
                        case AVAssetExportSessionStatusCompleted: {
                            //                    NSLog (@"SUCCESS");
                            completionBlock(YES);
                            break;
                        }
                    };
                });

            }];
        }

    }

然后视频比源livephoto更红.

这是demo link on github

>运行项目
>它将在1s后呈现imagepicker.
>选择livephoto
>然后点击选择
>然后新视频保存到您的相册.它变红了!

最佳答案 哎呀!

去做就对了!

AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:videoasset presetName:AVAssetExportPresetPassthrough];

This export option will cause the media of all tracks to be passed through to the output exactly as stored in the source asset, except for
tracks for which passthrough is not possible, usually because of constraints of the container format as indicated by the specified outputFileType.
This option is not included in the arrays returned by -allExportPresets and -exportPresetsCompatibleWithAsset.

点赞