ios直播

iOS 直播专题3-前置处理

2021-03-21  本文已影响0人  浪人残风

前置处理

上一篇iOS 直播专题2-音视频采集提到视频采集采用的是GPUImage框架,这个框架集成了很多滤镜效果

这里主要介绍美颜、水印处理
处理流程:


image.png

美颜

这里的美颜效果用的是GPUImageBeautyFilter
功能:

水印

功能:
自定义水印的视图UIView

- (void)reloadFilter {
    [self.filter removeAllTargets];
    [self.blendFilter removeAllTargets];
    [self.uiElementInput removeAllTargets];
    [self.videoCamera removeAllTargets];
    [self.output removeAllTargets];
    [self.cropfilter removeAllTargets];
    
    if (self.beautyFace) { // 开启美颜
        self.output = [[GPUImageEmptyFilter alloc] init];
        self.filter = [[GPUImageBeautyFilter alloc] init];
        self.beautyFilter = (GPUImageBeautyFilter *)self.filter;
    } else { // 不开启美颜
        self.output = [[GPUImageEmptyFilter alloc] init];
        self.filter = [[GPUImageEmptyFilter alloc] init];
        self.beautyFilter = nil;
    }
    
    /// 调节镜像
    [self reloadMirror];
    
    // 480*640 比例为4:3  强制转换为16:9
    if([self.configuration.avSessionPreset isEqualToString:AVCaptureSessionPreset640x480]){
        CGRect cropRect = self.configuration.landscape ? CGRectMake(0, 0.125, 1, 0.75) : CGRectMake(0.125, 0, 0.75, 1);
        self.cropfilter = [[GPUImageCropFilter alloc] initWithCropRegion:cropRect];
        [self.videoCamera addTarget:self.cropfilter];
        [self.cropfilter addTarget:self.filter];
    }else{
        [self.videoCamera addTarget:self.filter];
    }
    
    // 添加水印
    if(self.warterMarkView){
        // filter和uiElementInput同时输出到blendFilter混合通道
        [self.filter addTarget:self.blendFilter];
        /// GPUImageUIElement将waterMarkContentView属性的视图转为纹理,输入到输出源
        [self.uiElementInput addTarget:self.blendFilter];
        
        [self.blendFilter addTarget:self.gpuImageView];
        if(self.saveLocalVideo) {
            [self.blendFilter addTarget:self.movieWriter];
        }
        [self.filter addTarget:self.output];
        [self.uiElementInput update];
    }else{
        [self.filter addTarget:self.output];
        [self.output addTarget:self.gpuImageView];
        if(self.saveLocalVideo) {
            [self.output addTarget:self.movieWriter];
        }
    }
    
    [self.filter forceProcessingAtSize:self.configuration.videoSize];
    [self.output forceProcessingAtSize:self.configuration.videoSize];
    [self.blendFilter forceProcessingAtSize:self.configuration.videoSize];
    [self.uiElementInput forceProcessingAtSize:self.configuration.videoSize];
    
    
    // 输出数据
    __weak typeof(self) _self = self;
    [self.output setFrameProcessingCompletionBlock:^(GPUImageOutput *output, CMTime time) {
        [_self processVideo:output];
    }];
    
}

项目源码下载

上一篇下一篇

猜你喜欢

热点阅读