используйте GPUImage, чтобы добавить водяной знак для видео, поймать ошибку, такую ​​как «попытался перевыпустить буфер кадра» - PullRequest
0 голосов
/ 29 июня 2018

это меня смущает, потому что иногда только после того, как вы протестируете 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...], но он тоже не работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...