【问题标题】:How to change CIFilter value of video using UISlider?如何使用 UISlider 更改视频的 CIFilter 值?
【发布时间】:2020-01-09 06:04:21
【问题描述】:

我正在尝试将 CIFilters 添加到视频中。但是我使用 UISliders 更改了值,因为 AVPlayer 需要时间来播放过滤器添加的视频。我搜索了这个问题,UISlider 值不断变化,它也采用浮点值。因为每次过滤器都会添加到视频和播放中。我想知道当滑块值连续变化时如何改变 CIFilter 的值和不延迟 AVPlayer 的值。

float value = sender.value;
CIFilter *filter = [CIFilter filterWithName:@"CIColorControls"];
AVVideoComposition *composition = [AVVideoComposition videoCompositionWithAsset:tempAVAsset applyingCIFiltersWithHandler:
                                   ^(AVAsynchronousCIImageFilteringRequest *request){
                                       NSError *err = nil;
                                       CIImage *filtered = [request.sourceImage imageByClampingToExtent];
                                       [filter setDefaults];
                                       [filter setValue:filtered forKey:kCIInputImageKey];

                                       [filter setValue:[NSNumber numberWithFloat:0.00] forKey:@"inputSaturation"];
                                       [filter setValue:[NSNumber numberWithFloat:0.00] forKey:@"inputBrightness"];
                                       [filter setValue:[NSNumber numberWithFloat:value] forKey:@"inputContrast"];

                                       CIImage *output = [filter.outputImage imageByCroppingToRect:request.sourceImage.extent];
                                       if (filtered)
                                           [request finishWithImage:output context:nil];
                                       else
                                           [request finishWithError:err];

                                   }];

【问题讨论】:

    标签: ios objective-c avplayer uislider cifilter


    【解决方案1】:

    当滑块值发生变化时,您可以只在合成块之外更改过滤器参数,而不要在块内重新设置它。所以就去做吧

    [adjustFilter setValue:[NSNumber numberWithFloat:sender.value] forKey:@"inputContrast"];
    

    在您的 valueChanged 回调中,而不是在组合块中。这样,过滤器始终获取最新值并将其用于下一个视频帧。

    编辑:

    以下是视图控制器内可能实现的一些部分:

    @interface DemoViewController ()
    
    @property (strong, nonatomic) CIFilter *filter;
    @property (strong, nonatomic) AVPlayer *player;
    @property (strong, nonatomic) AVAsset *tempAVAsset;
    
    @end
    
    @implementation DemoViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        // setup filter
        self.filter = [CIFilter filterWithName:@"CIColorControls"];
        [self.filter setDefaults];
        [self.filter setValue:[NSNumber numberWithFloat:0.00] forKey:@"inputSaturation"];
        [self.filter setValue:[NSNumber numberWithFloat:0.00] forKey:@"inputBrightness"];
    
        AVVideoComposition *composition = [AVVideoComposition videoCompositionWithAsset:self.tempAVAsset applyingCIFiltersWithHandler:
            ^(AVAsynchronousCIImageFilteringRequest *request){
                NSError *err = nil;
                CIImage *filtered = [request.sourceImage imageByClampingToExtent];
    
                [self.filter setValue:filtered forKey:kCIInputImageKey];
                CIImage *output = [self.filter.outputImage imageByCroppingToRect:request.sourceImage.extent];
                if (filtered)
                   [request finishWithImage:output context:nil];
                else
                   [request finishWithError:err];
            }
        ];
    
        // setup player with composition
        // ...
    }
    
    
    - (IBAction)sliderValueChanged:(UISlider*)sender
    {
        // get the new slider value and assign it to the filter
        [self.filter setValue:[NSNumber numberWithFloat:sender.value] forKey:@"inputContrast"];
    }
    
    @end
    

    【讨论】:

    • 我有错误这样做。 [ setValue:forUndefinedKey:]
    • CIExposureAdjust 没有inputContrast。在上面的代码中,您使用了 CIColorControls 过滤器。
    • 我尝试了不同的 cifilters。现在没有错误,但问题是我在完成块之外添加了代码行,在 avplayer 中没有变化。
    • adjustFilter 来自哪里?在组合块中和应用滑块值时,它必须是相同的实例。
    • 整个代码的范围是什么?每次滑块值更改时,您是否都在创建新的合成?
    猜你喜欢
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多