iOS 如何实现美颜功能


            
2018-11-07 10:32 | 音视频服务

回答:

1. 基于 callkit 实现美颜

如果使用 callkit ,进行美颜,需要拿到我们的 callkit 的源码,在开启音视频之前加上下面的方法,告诉 calllib , 要使用美颜功能。

1.1 设置美颜开关
  [[RCCallClient sharedRCCallClient] setEnableBeauty:YES];
1.2 实现代理方法

我们的 callkit  是在 RCCallBaseViewController 这个 VC 里面实现的代理方法,所以就在这个类里面加上美颜的代理方法即可。

/*!
 当前通话本地视频数据, 用于GPU滤镜处理, 同步返回处理后的同一sampleBuffer对象, 需要本地视频数据时首先调用 RCCallClient.h 中 - (void)setEnableBeauty:(BOOL)enable方法, 该方法默认为NO.
 若设置setEnableBeauty为Yes, 但未实现processVideoFrame:则使用默认美颜.
 @param sampleBuffer   本地视频数据
 */
- (CMSampleBufferRef)processVideoFrame:(CMSampleBufferRef)sampleBuffer;

2. 基于 calllib 实现美颜

在使用我们 calllib 的时候,您如果想实现美颜功能,需要实现以下方法:

2.1 设置是否允许美颜开关

接口:

/**
 设置本地视频属性,是否使用默认美颜

 @param enable YES:使用  NO:不使用(默认)
 */
- (void)setEnableBeauty:(BOOL)enable;
2.2 实现代理方法

调用 calllib 的开启音视频通话的接口,会返回一个 callsession 的通话实体,拿到这个通话实体之后,设置他的代理方法

[_callSession setDelegate:self];

然后实现他的美颜代理方法:

/*!
 当前通话本地视频数据, 用于GPU滤镜处理, 同步返回处理后的同一sampleBuffer对象, 需要本地视频数据时首先调用 RCCallClient.h 中 - (void)setEnableBeauty:(BOOL)enable方法, 该方法默认为NO.
 若设置setEnableBeauty为Yes, 但未实现processVideoFrame:则使用默认美颜.
 @param sampleBuffer   本地视频数据
 */
- (CMSampleBufferRef)processVideoFrame:(CMSampleBufferRef)sampleBuffer;

在这个方法里面去做美颜的事情,返回处理过的 sampleBuffer 即可。

3. 基于 RongRTC 实现美颜

如果您使用我们的最底层的 RongRTC 引擎 2.1.0 及其之前的版本,使用美颜功能,需要以下几个步骤。

3.1 在 joinChannel 之前,设置相关参数,其中要包含美颜开关的参数
/*!
 @method
 @abstract 必须在调用joinChannel:前设置本地视频参数才能生效, 不设置则使用默认值
 @param parameters  kAudioOnly:    是否为纯音频, 默认值为NO
                    kVideoProfile: 本地视频分辨率, 默认值为RongRTC_VideoProfile_640_480P
                    kMaxBandWidth: 最大码率, 默认值为500
                    kUserType:     用户类型, 默认值为RongRTC_User_Normal
                    kCloseCamera:  是否关闭视频显示, 默认值为1, 不关闭视频
 */
- (void)setVideoParameters:(NSDictionary *)parameters;

示例:

 [self.rongRTCEngine setVideoParameters:self.paraDic];

其中,参数字典中需要包括 kGPUFilter 设置为 yes,就表示使用美颜,然后实现代理方法,

3.2 实现美颜代理
/*!
 @method
 @abstract 自定义GPU滤镜, 将参数中的sampleBuffer进行处理后同步返回.
           需要自定义滤镜时, 实现此delegate方法并返回自定义处理后的CMSampleBufferRef, 则按自定义视频显示. 如果返回nil则按原视频显示.
 @param sampleBuffer 视频数据
 */
- (CMSampleBufferRef)rongRTCEngine:(RongRTCEngine *)engine onGPUFilterSource:(CMSampleBufferRef)sampleBuffer;

处理 buffer 即可 , 如果返回的 buffer 不为 nil , 则表示使用美颜,如果为 nil , 则表示不使用美颜。

我们的 RongRTC 是最底层的引擎,提供通讯和会议等能力,一些例如音视频的功能,需要基于我们的引擎二次开发,我们的 calllib 是基于我们的 RongRTC 引擎开发的一套音视频能力库,提供例如音频视频,群内多人音视频等功能,没有 UI 界面,我们的 callkit 是基于 RongRTC 和 callib 开发的有 UI 界面的通讯能力库, 可提供音视频能力和 UI 界面,开发者可以根据自己的需求去选择相应的库,在相应的库的基础上进行操作即可,这里有关于三者更详细的说明,这里有关于三者的文档,这里有融云的开源代码,如 callkit。

您认为此回答对您有帮助?

共有 0 位开发者认为此问题有帮助

我对此仍有疑问!继续追问