AVAssetExportSession,AVMutableVideoComposition делают видео более красным

Я получил видео с 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;
                        }
                    };
                });

            }];
        }

    }

тогда видео будет более красным, чем исходное фото.

вот демо-ссылка на github

  1. запустить проект
  2. это представит imagepicker после 1 с.
  3. выберите живое фото
  4. и нажмите выбрал
  5. затем новое видео сохраните в свой альбом. Это стало красным!

1 ответ

Решение

Opps! Просто сделай это!

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

Эта опция экспорта приведет к тому, что носители всех дорожек будут передаваться на выход точно так, как они хранятся в исходном ресурсе, за исключением дорожек, для которых проход невозможен, как правило, из-за ограничений формата контейнера, как указано с помощью указанного параметра outputFileType. Эта опция не включена в массивы, возвращаемые -allExportPresets и -exportPresetsCompatibleWithAsset.

Другие вопросы по тегам