首页 > 解决方案 > AVVideoComposition、CIFilter、CIImage 的 iOS 视频过滤器非常慢

问题描述

我想从照片中过滤选定的视频,所以使用 CIFilter 和 AVVideoComposition 但这需要太多时间。

30秒的视频需要3分钟。

如何减少过滤时间。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {

    [self dismissViewControllerAnimated:YES completion:nil];

    NSURL *videoUrl = [info objectForKey:UIImagePickerControllerMediaURL];

    CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
    AVAsset *asset = [AVAsset assetWithURL:videoUrl];

    AVVideoComposition *composition = [AVVideoComposition videoCompositionWithAsset:asset applyingCIFiltersWithHandler:^(AVAsynchronousCIImageFilteringRequest * _Nonnull request) {

        CIImage *ciImage = request.sourceImage.imageByClampingToExtent;

        [filter setValue:ciImage forKey:kCIInputImageKey];

        Float64 seconds = CMTimeGetSeconds(request.compositionTime);
        [filter setValue: @(seconds * 10.0) forKey:kCIInputRadiusKey];

        CIImage *outputImage = [filter.outputImage imageByCroppingToRect:request.sourceImage.extent];

        [request finishWithImage:outputImage context:nil];
    }];


    NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.mp4"];
    unlink([pathToMovie UTF8String]);
    NSURL *outputUrl = [NSURL fileURLWithPath:pathToMovie];


    AVAssetExportSession *export = [AVAssetExportSession exportSessionWithAsset:asset presetName:AVAssetExportPresetHighestQuality];
    export.outputFileType = AVFileTypeQuickTimeMovie;
    export.outputURL = outputUrl;
    export.videoComposition = composition;
    [export exportAsynchronouslyWithCompletionHandler:^{
        NSLog(@"Video Output url : %@", outputUrl.absoluteString);
    }];

}

标签: iosobjective-ccifilteravvideocomposition

解决方案


推荐阅读