进阶功能

理解Pipeline

AVBase组件中包含两个比较重要的接口定义:

  • @protocol AVInput;
  • @interface AVOutput;

  1. AVOutput的子类能够输出 CMSampleBufferRef 对象给所有它的targets。可以作为Pipeline的起点。

  2. AVOutput\的子类既能够接受 CMSampleBufferRef 作为输入,也可以输出 CMSampleBufferRef 给所有它的targets。通常作为Pipeline的中间节点。

  3. 实现AVInput协议的类,可以处理输入的 CMSampleBufferRef 对象。可以作为Pipeline的终点。

自定义图像处理

用户可以实现CustomImageFilter(GPUImageFilter), 添加到ImageFilter的滤镜链中。

自定义多路音频混音

用户可以实现AudioMixSource, 添加到AudioFilter中。

self.source = [[BDCloudAVAudioInputMixSource alloc] init];
[self.audioFilter addSource:self.source];

自定义声音处理

用户可以实现CustomAudioFilter, 添加到AudioInputMixSource中。

图像处理顺序

SDK中提供了一些常用的图像处理滤镜,如美颜、颜色调整、风格滤镜。

用户在处理时,尽量使用 美颜 ---> 颜色 ---> 风格 滤镜这样的顺序。

用户还可以添加自定义的CustomImageFilter到滤镜链中。

声音处理顺序

从麦克风,或者从视频文件分离出声音后,按照以下步骤进行处理:

  1. 如果用户添加了CustomAudioFilter,先调用CustomAudioFilter接口进行处理;
  2. 混响;
  3. 混音;
  4. 转换为设置的输出格式。

美颜滤镜

我们内置了两种美颜算法,BDCloudAVNaturalBeautyFilterBDCloudAVBeautyFilter,前者比较自然,后者带有柔焦效果,请根据实际使用场景选择对应的算法。

美颜参数调整

// 美白,取值[0f, 1.0f]
beautyFilter.brightLevel = bright;
// 磨皮,取值[0f, 1.0f]
beautyFilter.beautyLevel = beauty;
// 粉嫩,取值[0f, 1.0f]
beautyFilter.toneLevel = tone;

几组美颜经验值:

  • 无: (美白,磨皮,粉嫩) = (0f, 0f, 0f);
  • 自然: (美白,磨皮,粉嫩) = (0.4f, 0.55f, 0.05f);
  • 美白: (美白,磨皮,粉嫩) = (0.65f, 0.35f, 0.45f);
  • 粉嫩: (美白,磨皮,粉嫩) = (0.6f, 0.35f, 0.95f);
  • 魔幻: (美白,磨皮,粉嫩) = (0.65f, 0.80f, 0.65f);

颜色调整滤镜

// 亮度,取值[-1f, 1f], 默认为0f
colorAdjustFilter.brightLevel = bright;
// 对比度, 取值[0f, 4f], 默认为1f
colorAdjustFilter.contrastLevel = contrast;
// 饱和度, 取值[0f, 2f], 默认为1f
colorAdjustFilter.saturationLevel = saturation;
// 色温, 取值[-180f, 180f], 默认为0f
colorAdjustFilter.hueLevel = hue;
// 锐度, 取值[-4f, 4f], 默认为0f
colorAdjustFilter.sharpenLevel = sharpness;

绿幕抠图滤镜

颜色混合滤镜,默认对绿色抠图,也可实现其他颜色的抠图

// 混合灵敏度,控制着会被替换的颜色的相似度,取值[0f, 1f],默认为0.3f
blendFilter.thresholdSensitivity = thresholdSensitivity;
// 混合平滑度,控制着在图像中如何逐渐地替换相似的颜色,取值[0f, 1f],默认为0.1f
blendFilter.smoothing = smoothing;
// 被替换的颜色色值,使用单独的红,绿,蓝组件指定,取值[0f, 1f],默认色值为绿色:(0.0, 1.0, 0.0)
[blendFilter setColorToReplaceRed:redComponent green:greenComponent blue:blueComponent];

变速处理原理

  • 视频变速

视频变速通过添加内置的AVSpeedFilter来实现

float speed = <0.3 ~ 3.0>;
self.speedFilter = [[BDCloudAVSpeedFilter alloc] init];
self.speedFilter.speed = speed;
  • 音频变速

在预览与合成场景中,我们对读取的视频文件的音频做变速处理,对新增的背景音乐不做任何处理。

而在录制场景中,为了优化用户体验,我们用两个AudioFilter分别在预览阶段对背景音乐做了1/speed变速处理(即加速场景下,对BGM做慢速处理;慢速场景下,对BGM做加速处理),在写入阶段对混音后的音频再做真正的变速处理。