如何使用 UISlider 更改视频的 CIFilter 值?
How to change CIFilter value of video using UISlider?
我正在尝试将 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];
}];
当滑块值发生变化时,您可以只在组合块外部更改过滤器参数,而不要在块内重新设置它。所以就这样做
[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
我正在尝试将 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];
}];
当滑块值发生变化时,您可以只在组合块外部更改过滤器参数,而不要在块内重新设置它。所以就这样做
[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