前言:利用GPUImage可以给图片或者视频添加水印,大致分为三种水印:视频水印,图片水印,文字水印。其中图片水印与文字水印更为相似。本文结合具体实例来讲解录制视频时添加文字水印的实现过程。
大致思路:
1.利用GPUImageUIElement 创建相关水印(文字/图片水印)
2.创建相关GPUImageVideoCamera及GPUImageMovieWriter对象
3.给GPUImageVideoCamera添加GPUImageFilter 为target
4.通过GPUImageDissolveBlendFilter将GPUImageFilter及GPUImageUIElement 合并,即将GPUImageVideoCamera和GPUImageUIElement 添加进响应链
5.最后将GPUImageDissolveBlendFilte添加到imageview 及GPUImageMovieWriter 上即可。GPUImageMovieWriter 是响应链的终端
-
具体实现代码如下:
GPUImageView *filterView = [[GPUImageView alloc] initWithFrame:self.view.frame]; self.view = filterView; filter = [[GPUImageDissolveBlendFilter alloc] init]; [(GPUImageDissolveBlendFilter *)filter setMix:0.5]; CGSize size = self.view.bounds.size; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; label.text = @"@兮逸博客"; label.font = [UIFont systemFontOfSize:17.f]; label.textColor = [UIColor redColor]; [label sizeToFit]; UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)]; subView.backgroundColor = [UIColor clearColor]; [subView addSubview:label]; GPUImageUIElement *elementUI = [[GPUImageUIElement alloc] initWithView:subView]; videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"]; unlink([pathToMovie UTF8String]); NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(640.0, 480.0)]; movieWriter.encodingLiveVideo = YES; GPUImageFilter* progressFilter = [[GPUImageFilter alloc] init]; [videoCamera addTarget:progressFilter]; [progressFilter addTarget:filter]; [elementUI addTarget:filter]; //显示到界面 [filter addTarget:filterView]; [filter addTarget:movieWriter]; videoCamera.audioEncodingTarget = movieWriter; [videoCamera startCameraCapture]; [movieWriter startRecording]; CADisplayLink* dlink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateProgress)]; [dlink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; [dlink setPaused:NO]; __weak typeof(self) weakSelf = self; [progressFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *output, CMTime time) { [elementUI updateWithTimestamp:time]; }]; [movieWriter setCompletionBlock:^{ __strong typeof(self) strongSelf = weakSelf; [strongSelf->filter removeTarget:strongSelf->movieWriter]; [strongSelf->movieWriter finishRecording]; ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(pathToMovie)) { [library writeVideoAtPathToSavedPhotosAlbum:movieURL completionBlock:^(NSURL *assetURL, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ if (error) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"视频保存失败" message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } else { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"视频保存成功" message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } }); }]; } else { NSLog(@"error mssg)"); } }];