4

我从 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更红。

这是github上的演示链接

  1. 运行项目
  2. 它会在 1 秒后显示图像选择器。
  3. 选择实时照片
  4. 并点击选择
  5. 然后将新视频保存到您的相册。变红了!
4

1 回答 1

2

哎呀!去做就对了!

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

此导出选项将导致所有轨道的媒体完全按照存储在源资产中的方式传递到输出,但无法通过的轨道除外,通常是由于指定的 outputFileType 指示的容器格式的限制。此选项不包含在 -allExportPresets 和 -exportPresetsCompatibleWithAsset 返回的数组中。

于 2016-07-22T06:55:28.537 回答