前置處理
- 對(duì)視頻添加美顏、水印、濾鏡等
- 對(duì)音頻進(jìn)行混音、消除環(huán)境音、聲音特效等
上一篇iOS 直播專題2-音視頻采集提到視頻采集采用的是GPUImage框架,這個(gè)框架集成了很多濾鏡效果
這里主要介紹美顏、水印處理
處理流程:

image.png
美顏
這里的美顏效果用的是GPUImageBeautyFilter
功能:
- 是否開啟美顏
- 美顏程度動(dòng)態(tài)調(diào)節(jié)
- 美白程度動(dòng)態(tài)調(diào)節(jié)
- 色調(diào)飽和度動(dòng)態(tài)調(diào)節(jié)
水印
功能:
自定義水印的視圖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;
}
/// 調(diào)節(jié)鏡像
[self reloadMirror];
// 480*640 比例為4:3 強(qiáng)制轉(zhuǎn)換為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同時(shí)輸出到blendFilter混合通道
[self.filter addTarget:self.blendFilter];
/// GPUImageUIElement將waterMarkContentView屬性的視圖轉(zhuǎn)為紋理,輸入到輸出源
[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];
// 輸出數(shù)據(jù)
__weak typeof(self) _self = self;
[self.output setFrameProcessingCompletionBlock:^(GPUImageOutput *output, CMTime time) {
[_self processVideo:output];
}];
}