首页 > 解决方案 > 使用 GPUImage 为视频添加水印,捕获错误,例如“试图过度释放帧缓冲区”

问题描述

这让我感到困惑,因为有时只有在您测试 5-6 次后才会出现,但有时您只需再测试 1 次。这是我的代码:

UIImage *coverImage1 = [UIImage imageNamed:@"imageName"];
UIImageView *coverImageView1 = [[UIImageView alloc] initWithImage:coverImage1];
[coverImageView1 setFrame:CGRectMake(20, size.height-100, 210, 50)];


UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];
subView.backgroundColor = [UIColor clearColor];

[subView addSubview:coverImageView1];

GPUImageUIElement *uielement = [[GPUImageUIElement alloc] initWithView:subView];
NSString *pathToMovie =string;
unlink([pathToMovie UTF8String]);
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];

movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(720.0, 1280.0)];

GPUImageFilter* progressFilter = [[GPUImageFilter alloc] init];
[progressFilter addTarget:filter];
[movieFile addTarget:progressFilter];
[uielement addTarget:filter];
movieWriter.shouldPassthroughAudio = YES;
movieFile.audioEncodingTarget = movieWriter;
[filter addTarget:movieWriter];
[movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter];
[movieWriter startRecording];
[movieFile startProcessing];

__weak typeof(self) weakSelf = self;
[progressFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *output, CMTime time) {
    [uielement update];
}];
[movieWriter setCompletionBlock:^{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        __strong typeof(self) strongSelf = weakSelf;
        [strongSelf->filter removeTarget:strongSelf->movieWriter];
        [strongSelf->movieWriter finishRecording];
        [uielement useNextFrameForImageCapture];
        //[[GPUImageContext sharedFramebufferCache]purgeAllUnassignedFramebuffers];
        UISaveVideoAtPathToSavedPhotosAlbum(strongSelf->string, strongSelf, @selector(video:didFinishSavingWithError:contextInfo:), nil);
    });
}];

我试图移动[uielement useNextFrameForImageCapture];内部[progressFilter setFrameProcessingCompletionBlock...],但它也不起作用

标签: iosobjective-c

解决方案


推荐阅读