AVAssetExportSession和AVMutableVideoComposition使视频更红

4

我从实况照片中得到了视频,并多次以以下方式导出视频。
它比源实况照片更红。这是一个错误吗?
这是导出代码,末尾有演示项目。

- (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更红。

这里是Github上的演示链接

  1. 运行项目
  2. 1秒后它会呈现图像选择器。
  3. 选择Livephoto
  4. 点击选择
  5. 然后新视频保存到您的相册。 它变成了红色!
1个回答

2

哎呀! Just do it!

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

此导出选项将使所有轨道的媒体按照源资产中存储的方式直接传递到输出,除了无法进行直通的轨道,通常是由于指定的 outputFileType 所表示的容器格式的限制。此选项不包括由-allExportPresets和-exportPresetsCompatibleWithAsset返回的数组中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接