注意点:

1、resultPixelBuffer属性set方法写法

2、uiElement懒加载方式,以及在init方法中进行预懒加载

3、GPUImageAlphaBlend的用法,disableSecondFrameCheck,这样只是在需要更新水印的时候检查更新就不会调用很多次

4、注意GPUImageUIElement的这种写法

        __unsafe_unretained GPUImageUIElement *weakOverlay = uiElement;

        [filter disableSecondFrameCheck];//这样只是在需要更新水印的时候检查更新就不会调用很多次

        runAsynchronouslyOnVideoProcessingQueue(^{

            [weakOverlay update];

        });

@interface VideoProcessingManager ()
@property (nonatomic, strong) NSMutableArray *filterArray;@property (nonatomic, strong) MFPixelBufferHelper *pixelBufferHelper;@property (nonatomic, assign) CVPixelBufferRef resultPixelBuffer;@property (nonatomic, strong) GPUImageUIElement *uiElement;@end@implementation VideoProcessingManager- (instancetype)init {self = [super init];if (self) {dispatch_async(dispatch_get_main_queue(), ^{// 这里是放到主线程预缓存水印GPUImageUIElement *tmp = self.uiElement;});}return self;
}#pragma mark - CapturerManagerDelegate
- (CVPixelBufferRef)processFrame:(CVPixelBufferRef)pixelBuffer {CVPixelBufferRef outputPixelBuffer = pixelBuffer;if (!self.resultPixelBuffer) {CVPixelBufferRef pixelBuffer = [self renderByGPUImage:outputPixelBuffer];self.resultPixelBuffer = pixelBuffer;CVPixelBufferRelease(pixelBuffer);}outputPixelBuffer = self.resultPixelBuffer;return outputPixelBuffer;
}- (void)setResultPixelBuffer:(CVPixelBufferRef)resultPixelBuffer {if (_resultPixelBuffer &&resultPixelBuffer &&CFEqual(resultPixelBuffer, _resultPixelBuffer)) {return;}if (resultPixelBuffer) {CVPixelBufferRetain(resultPixelBuffer);}if (_resultPixelBuffer) {CVPixelBufferRelease(_resultPixelBuffer);}_resultPixelBuffer = resultPixelBuffer;
}- (MFPixelBufferHelper *)pixelBufferHelper {if (!_pixelBufferHelper) {EAGLContext *context = [[GPUImageContext sharedImageProcessingContext] context];_pixelBufferHelper = [[MFPixelBufferHelper alloc] initWithContext:context];}return _pixelBufferHelper;
}- (CVPixelBufferRef)renderByGPUImage:(CVPixelBufferRef)pixelBuffer {CVPixelBufferRetain(pixelBuffer);__block CVPixelBufferRef output = nil;__weak typeof(self) weakSelf = self;runSynchronouslyOnVideoProcessingQueue(^{[GPUImageContext useImageProcessingContext];// (1)GLuint textureID = [weakSelf.pixelBufferHelper convertYUVPixelBufferToTexture:pixelBuffer];CGSize size = CGSizeMake(CVPixelBufferGetWidth(pixelBuffer),CVPixelBufferGetHeight(pixelBuffer));[GPUImageContext setActiveShaderProgram:nil];// (2)GPUImageTextureInput *textureInput = [[GPUImageTextureInput alloc] initWithTexture:textureID size:size];
//        GPUImageSmoothToonFilter *filter = [[GPUImageSmoothToonFilter alloc] init];
//        [textureInput addTarget:filter];GPUImageBrightnessFilter *brightNessFilter = [[GPUImageBrightnessFilter alloc] init];brightNessFilter.brightness = -1;[textureInput addTarget:brightNessFilter];/**///创建滤镜GPUImageUIElement *uiElement = self.uiElement;GPUImageAlphaBlendFilter *filter = [[GPUImageAlphaBlendFilter alloc] init];filter.mix = 1.0;
//        [textureInput addTarget:filter];[brightNessFilter addTarget:filter];[uiElement addTarget:filter];/**/GPUImageTextureOutput *textureOutput = [[GPUImageTextureOutput alloc] init];
//        [filter addTarget:textureOutput];
//[filter addTarget:textureOutput];/**/__unsafe_unretained GPUImageUIElement *weakOverlay = uiElement;[filter disableSecondFrameCheck];//这样只是在需要更新水印的时候检查更新就不会调用很多次runAsynchronouslyOnVideoProcessingQueue(^{[weakOverlay update];});/**/[textureInput processTextureWithFrameTime:kCMTimeZero];// (3)output = [weakSelf.pixelBufferHelper convertTextureToPixelBuffer:textureOutput.texturetextureSize:size];[textureOutput doneWithTexture];glDeleteTextures(1, &textureID);});CVPixelBufferRelease(pixelBuffer);return output;
}- (GPUImageUIElement *)uiElement {if (!_uiElement) {CGSize size = [UIScreen mainScreen].bounds.size;//添加时间戳水印和图片水印UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];UIImageView *imageV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];
//        imageV.backgroundColor = [UIColor cyanColor];imageV.image = [UIImage imageNamed:@"QQ.png" inBundle:[NSBundle bundleForClass:self.class] compatibleWithTraitCollection:nil];[contentView addSubview:imageV];NSDateFormatter *formatter = [[NSDateFormatter alloc] init];[formatter setDateFormat:@"yyyy年MM月dd日hh:mm:ss"];NSDate *currentDate = [NSDate date];NSString *timeString = [formatter stringFromDate:currentDate];UILabel *timestampLabel = [[UILabel alloc] initWithFrame:CGRectMake(contentView.frame.size.width * 0.5 - 80, 200, 160, 60)];timestampLabel.text = timeString;timestampLabel.textColor = [UIColor redColor];[contentView addSubview:timestampLabel];//创建水印图形GPUImageUIElement *uiElement = [[GPUImageUIElement alloc] initWithView:contentView];_uiElement = uiElement;}return _uiElement;
}@end

MFPixelBufferHelper 见:【CVPixelBufferRef】添加滤镜的方法_allanGold的博客-CSDN博客

【滤镜】CVPixelBufferRef处理成黑屏+水印相关推荐

  1. PS完美支持M1芯片mac(Adobe photoshop2019直装版M1安装方法)适用M1芯片处理器 (此版本已解决在M1电脑上出现“液化”滤镜和WEB等黑屏问题)

    Adobe软件兼容性更新 ,PR/PS/AE/LR/AU等软件已全部支持苹果最新M1芯片 ,搭建可以放心购买m1芯片的苹果电脑了- 苹果公司最新发布的基于M1芯片的Mac笔记本电脑应该很多小伙伴都入手 ...

  2. Android系统移植与调试之-------)如何修改Android手机NFC模块,使黑屏时候能够使用NFC

    我们都知道在不修改源代码的情况下,只能是解锁之后才能使用NFC功能.而在锁屏和黑屏2个状态下是没办法用NFC的,但是最近有个客户要求手机在黑屏状态下能够使用NFC,因此我们需要去修改Android源代 ...

  3. 解决H5播放视频黑屏只有声音没有图像的问题,Java调用ffmpeg转码成h264的mp4格式

    前端用的是HTML5的<video>标签播放的视频.由于其并不能支持所有视频类型的播放,所以我们需要把视频转码为其支持的编码如h264.否则会出现黑屏只有声音没有图像的问题. 网上的方法大 ...

  4. Unity 打包成APK部分安卓机黑屏

    近期才发现的问题,打包的Unity版本是2017.4.30 开发AR程序发布安卓测试的时候拿同事的华为手机发现出现了黑屏的情况,但是摄像头功能还是存在的,就是黑屏去把摄像头对准扫描图依然会触发识图后的 ...

  5. 微软反盗版全球黑屏|中国成惟一例外

    昨日凌晨,微软发布消息称,2 月17日将发布针对"Windows激活技术"的更新,以验证用户使用的操作系统是否为正版.非正版用户若安装该更新,30天宽限期过后,电脑桌面壁纸将 变为 ...

  6. 如何让电脑不进入黑屏状态,教程在这里,WIN10系统下电脑怎么设置成不黑屏

    电脑如何才能不黑屏即不进入休眠模式呢,小编今天来教大家如何关闭电脑上的休眠模式设置: 第一步.小编电脑装的是WIN10系统,这里就以WIN10系统为例,首先点击电脑屏幕左下角的WINDOWS图标即&q ...

  7. 电脑开机输完密码就黑屏的解决历程

    前天在图书馆敲完代码是电脑出问题之前最后一次使用电脑,昨天回到寝室一开机便发现输完密码直接黑屏,只能看到鼠标,花了一天时间解决,以下为过程: 1.用ctrl+alt+delete运行任务管理器,新建任 ...

  8. PC辉光效果一切正常,安卓辉光却没效果、显示异常(爆闪、黑屏等)

    一:安卓端辉光不显示问题 问题描述:项目中使用unity的PostProcessing package实现辉光的功能,在pc上辉光效果一切正常,但是打出apk在真机测试时,辉光基本没效果. 解决思路: ...

  9. u盘安装centos8黑屏_崩溃!电脑突然黑屏无法启动

    Hello!我是爽哥,欢迎你的到来,我会不定期推送关于电脑方面的实用教程及资讯,关注公众号名称"爽哥来搞机",实用干货全部拿走! 什么?!为什么我的电脑一直黑屏无法开机了,昨天还好 ...

最新文章

  1. 青岛能源所提出微生物组相似度新算法DMS
  2. vue-cli Invalid Host header
  3. swift 如何实现点击view后显示灰色背景
  4. Sharepoint学习笔记 –架构系列—11 Sharepoint的服务器端对象模型(Server Object Model) 3.服务层次结构
  5. python游戏入门书籍推荐
  6. java定时任务增删改查_python实现crontab定时任务的增删改查
  7. 微信小程序 1 ~ Hello 微信小程序
  8. python 获取指定城市【昨日天气+未来15天预报天气+空气质量+气象数据】
  9. python常用字符串方法_python基础之字符串常用方法
  10. apache高性能配置
  11. 三菱plc232数据线驱动下载_失易得安卓恢复v5.3.5.0-失易得安卓恢复PC版下载
  12. ubuntu 搭建 smtp 邮件服务器
  13. 常见量化投资误区合集,量化交易新手脱坑指南 | 邢不行
  14. 多项式时间 P问题 NP问题
  15. java对zip、rar、7z文件带密码解压实例
  16. Android 关于佳博和汉印蓝牙热敏打印机开发,android面试必看书籍
  17. 编译原理实验:自上而下语法分析
  18. mac的home、end、pageUp、pageDown键
  19. H5页面添加音乐播放
  20. Win 10 微信多开

热门文章

  1. 搭建企业内部知识库,从知识管理做起
  2. 1142 - ALTER command denied to user ‘sdfsfs‘@‘dfsddfsdfsdfsd‘ for table ‘sdfsdfsdf‘
  3. E1线路知识点总结(转)
  4. c#获取其他窗口得内容
  5. 佳能相机MP4视频文件变小或打不开播放不了怎么修复
  6. 金融保险产品介绍PPT模板
  7. 网络最强PHP开发工具+电子书+视频教程等资料下载汇总
  8. 微信小程序云开发调用小票打印机实现方案(亲测)
  9. 以航天标准研制,饮冰携三款激光雷达上演价格战?...
  10. 苹果加粉神器-变态微商演示视频