前置处理
- 对视频添加美颜、水印、滤镜等
- 对音频进行混音、消除环境音、声音特效等
上一篇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];
}];
}
网友评论