0

私はGPUImage library hereを使用していましたが、役立つサンプルがたくさんありますが、フィルターを使用しているときにGPUImageVideoCamera. 既に録画されたビデオにフィルターを適用しようとしましたが、フィルターは正常に機能していますが、フィルターの値を変更しようとすると、GPUImageVideoCameraビデオを録画する必要がないため、使用していないため、フィルターの値が反映されません。ただし、フィルタ プレビューを実装してから、選択したフィルタを適用して新しいムービーを作成する必要があります。

以下に、コードの一部を入れています

- (void)viewDidLoad
{
    [super viewDidLoad];

    //Creating Filter
    filter=[[GPUImageSepiaFilter alloc] init];

    //Playing Video
    [self playVideo];
}

-(void)playVideo{

    if(!movieFile){
        movieFile = [[GPUImageMovie alloc] initWithURL:self.videoURL];
        movieFile.playAtActualSpeed=YES;
        movieFile.playSound=YES;
        movieFile.delegate=self;
    }



    [movieFile addTarget:filter];

    CGRect rect=self.viewMovie.frame;
    rect.origin=CGPointZero;


    self.filterView=[[GPUImageView alloc] initWithFrame:rect];
    [self.viewMovie addSubview:self.filterView];

    //Rotate the preview to fix portrait recored video to show properly
    if([self.transformation isEqualToString:@"portrait"]){
        self.filterView.rotation=kGPUImageRotateRight;
    }

    [self.filterView initMovie];
    [filter addTarget:self.filterView];


    double delayInSeconds = 0.5;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [movieFile startProcessing];
    });

}

- (IBAction)sliderAction:(id)sender {
    [self applySliderValue:self.slider.value];
}

//Doesn't work
-(void)applySliderValue:(float)sliderValue{
    [((GPUImageSepiaFilter *)filter) setIntensity:sliderValue];
}

どんな助けでも大歓迎です。

ありがとう。

4

1 に答える 1

1

最初にスライダーのペン先接続をデバッグすることをお勧めします:

-(void)applySliderValue:(float)sliderValue{
    NSLog(@"sliderValue: %f",sliderValue);
    [((GPUImageSepiaFilter *)filter) setIntensity:sliderValue];
}

すべてが正しく配線されている場合、スライダーを動かすと、デバッガーが 0.0 から 1.0 の間の一連の値をすばやく表示するはずです。

何も起こらない場合は、nib の構成に問題があります。値の範囲が 0.0 ~ 1.0 の範囲外の場合、UISlider の構成に問題があります。

それが正常に機能し、フィルターがまだ応答しない場合は、GPUImageSepiaFilter のカスタム サブクラス内でこのメソッドをオーバーライドして、もう少し掘り下げます。

- (void)setIntensity:(CGFloat)newIntensity;
{
    _intensity = newIntensity;

    NSLog(@"intensity: %f",_intensity);

    [self setFloat:_intensity forUniform:intensityUniform program:filterProgram];
}
于 2013-10-24T04:32:54.443 に答える