1. 程式人生 > >給GPUImage錄製的視訊新增水印

給GPUImage錄製的視訊新增水印

國內目前使用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。