首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用CIFilter改变视频的UISlider值?

如何用CIFilter改变视频的UISlider值?
EN

Stack Overflow用户
提问于 2019-09-06 10:56:34
回答 1查看 319关注 0票数 0

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

代码语言:javascript
复制
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];

                                   }];
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-06 11:21:53

当滑块值发生变化时,只需在组合块外部更改筛选器参数,并且不要在块内重新设置它。所以就这么做吧

代码语言:javascript
复制
[adjustFilter setValue:[NSNumber numberWithFloat:sender.value] forKey:@"inputContrast"];

valueChanged回调中,而不是在组合块中。这样,过滤器总是得到最当前的值,并将它用于下一个视频帧。

编辑:

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

代码语言:javascript
复制
@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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57820677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档