ios - 如何使用 UISlider 更改视频的 CIFilter 值?

标签 ios objective-c avplayer uislider cifilter

我正在尝试将 CIFilter 添加到视频中。但我使用 UISliders 更改值,因为 AVPlayer 需要时间来播放添加过滤器的视频。我搜索了这个问题,UISlider 值不断变化,并且它也需要浮点值。因为每次过滤器都会添加到视频并播放。我想知道当 slider 值连续变化时如何更改 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];

                                   }];

最佳答案

当 slider 值更改时,您可以仅更改合成 block 外部的过滤器参数,而不是在 block 内部重新设置它。所以就这样做

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

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

编辑:

以下是 View Controller 内可能实现的一些部分:

@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

关于ios - 如何使用 UISlider 更改视频的 CIFilter 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57820677/

相关文章:

objective-c - 使用 Storyboard 时,从 appdelegate 调用 View Controller 方法不起作用

用于防御性编码的 Wil Shipley 的 `IsEmpty` 方法的 Java 实现

ios - 标题 View 字段 iOS 上的阅读水龙头

swift - 当 UICollectionViewCell 不在 View 中时尝试暂停视频

ios - 时间格式 ios "2014-04-28T01:03:21.827753"

iphone - 使用 Jeff Lamarches 脚本加载模型

ios - Swift iOS -CMTimeMakeWithSeconds : warning: error of -0. 433 由于时间尺度非常短而引入

ios - 使用 AVPlayer 进行流式传输很慢

ios - 如何为 backBarButtonItem 设置自定义字体

objective-c - 在 C 中的结构中扩展数组