給GPUImage錄製的視訊新增水印
阿新 • • 發佈:2018-11-10
國內目前使用GPUImage來做視訊實時處理的應用貌似還不是很多,所以相關的資料也比較少。我們在實時錄製視訊之後,想加個水印,都要到處找資料,為了避免大家重複造輪子,現將我的解決辦法帖出來。
GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
blendFilter.mix = 1.0;
UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, _gpuView.frame.size.width,_gpuView.frame.size.height)]; contentView.backgroundColor = [UIColor clearColor]; UIImageView *ivTemp = [[UIImageView alloc] initWithFrame:CGRectMake(_gpuView.frame.size.width - 138, _gpuView.frame.size.height - 21, 135, 18)]; ivTemp.image = [UIImage imageNamed:@"waterMark"]; ivTemp.tag = 500; ivTemp.hidden = NO; [contentView addSubview:ivTemp]; if (_uiElementInput) { [_uiElementInput removeAllTargets]; } if (_waterMarkFilter) { [_waterMarkFilter removeAllTargets]; } if (!_uiElementInput) { _uiElementInput = [[GPUImageUIElement alloc] initWithView:contentView]; } [_waterMarkFilter addTarget:blendFilter]; [_uiElementInput addTarget:blendFilter]; __weak typeof(self) weakSelf = self; [_waterMarkFilter setFrameProcessingCompletionBlock:^(GPUImageOutput * filter, CMTime frameTime){ [contentView viewWithTag:500].hidden = NO; [weakSelf.uiElementInput update]; }]; _writefilter = blendFilter;
從上面的程式碼可知,關鍵點在於:
1,要加watermark,需使用 GPUImageUIElement。
2,做較為方便的控制水印的位置,需要一個containview,這個view和預覽view(_gupView)大小一致、起始位置也一樣。
3,為了防止記憶體洩露,我們需要使用weakSelf.
4,為了使螢幕不閃爍,水印ImageView的hidden屬性需要一直設定為NO。