相芯美颜
更新时间: 2024/03/15 17:20:41
NERTC SDK 支持接入相芯等第三方专业美颜滤镜厂商,实现美颜、美妆、滤镜、贴纸等美颜特效。在娱乐社交、在线教育等场景中,您可以快速构建具备美颜特效能力的应用,让用户在进行视频通话或直播时,呈现更良好的肌肤状态和精神面貌。
相芯美颜(Faceunity Nama SDK,下文简称 Nama SDK)的详细功能介绍请参见人脸特效。
准备工作
- 下载相芯美颜 SDK(推荐使用 V8.3.0 版本)。
- 获取相芯美颜 SDK 的证书,具体请联系网易云信商务经理。
- 获取相芯美颜资源文件,具体请联系网易云信商务经理。
- 集成 NERTC SDK,推荐使用 NERTC V4.6.50 及以后版本,V4.6.50 版本对相芯美颜进行了优化。
功能原理
-
NERTC SDK 提供了
onNERtcEngineVideoFrameCaptured: rotation:
采集数据回调的接口,将采集到的视频图像数据通过该接口回调出来。 -
Nama SDK 通过回调获取视频图像数据,进行美颜处理后,通过参数返回给 NERTC SDK。
-
NERTC SDK 将美颜后的数据进行编码和传输。
注意事项
- 该设置仅在加入房间之前设置才有效。
- 若 NERTC SDK 版本号低于3.7.0,需要在初始化 NERTC SDK 之前调用
setParameters
方法。 onNERtcEngineVideoFrameCaptured: rotation:
回调必须同步返回,且保证 CVPixelBufferRef 的地址值不被改变,分辨率不改变。
示例项目源码
网易云信提供第三方美颜的示例项目源码,您可以参考该源码实现第三方美颜。
实现方法
步骤1 集成相芯美颜
-
将证书文件
authpack.h
放到本地项目的Beauty
目录下。 -
将所需的美颜模型和道具放到本地项目的
Resource
目录下。 -
通过 Cocoapods 集成相芯美颜 SDK。
-
在 podfile 中添加以下代码。
pod 'Nama', '8.3.0'
-
在 terminal 中执行以下命令。
pod install
-
步骤2 初始化相芯美颜 SDK
// 引入头文件(iOS)
#import <libCNamaSDK/FURenderer.h>
// 初始化
[[FURenderer shareRenderer] setupWithData:nil dataSize:0 ardata:nil authPackage:&g_auth_package authSize:sizeof(g_auth_package) shouldCreateContext:YES];
// 加载AI模型
NSData *ai_human_processor = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"ai_human_processor.bundle" ofType:nil]];
[FURenderer loadAIModelFromPackage:(void *)ai_human_processor.bytes size:(int)ai_human_processor.length aitype:FUAITYPE_HUMAN_PROCESSOR];
NSData *ai_face_processor = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"ai_face_processor.bundle" ofType:nil]];
[FURenderer loadAIModelFromPackage:(void *)ai_face_processor.bytes size:(int)ai_face_processor.length aitype:FUAITYPE_FACEPROCESSOR];
步骤3 适配设备方向
NERTC的 onNERtcEngineVideoFrameCaptured
回调中,默认会返回视频的方向信息,进行图像处理之前,需要先使用相芯接口配置方向信息,否则一些涉及人脸识别的功能会发生异常。
- 创建 CMMotionManger,用于获取当前的设备方向。
self.motionManager = [[CMMotionManager alloc] init];
self.motionManager.accelerometerUpdateInterval = 0.5;// 1s刷新一次
if ([self.motionManager isDeviceMotionAvailable]) {
[self.motionManager startAccelerometerUpdates];
[self.motionManager startDeviceMotionUpdates];
}
- 在每次进行图像处理之前,判断一下当前的设备方向,并调用相芯接口配置方向信息。
// 存储当前的设备方向,默认值为0
@property (nonatomic, assign) int deviceOrientation;
// 获取设备方向
CMAcceleration acceleration = self.motionManager.accelerometerData.acceleration;
int orientation = 0;
if (acceleration.x >= 0.75) {
orientation = 1;
} else if (acceleration.x <= -0.75) {
orientation = 3;
} else if (acceleration.y <= -0.75) {
orientation = 0;
} else if (acceleration.y >= 0.75) {
orientation = 2;
}
// 根据设备方向来配置方向信息
if (orientation == 0) {
fuSetDefaultRotationMode(FU_ROTATION_MODE_270);
} else if (orientation == 1) {
fuSetDefaultRotationMode(FU_ROTATION_MODE_0);
} else if (orientation == 2) {
fuSetDefaultRotationMode(FU_ROTATION_MODE_90);
} else {
fuSetDefaultRotationMode(FU_ROTATION_MODE_180);
}
if (self.deviceOrientation != orientation) {
self.deviceOrientation = orientation;
// 若设备方向发生了变化,也需要通知相芯SDK
[FURenderer onCameraChange];
}
步骤4 视频图像处理
-
调用
setParameters
接口,将kNERtcKeyVideoCaptureObserverEnabled
的值设置为 YES,开启摄像头采集数据的回调。 -
在成功加入房间后调用
enableLocalVideo
方法开启本地视频采集。调用
enableLocalVideo
开启本地视频采集时,请设置streamType
为kNERtcStreamChannelTypeMainStream
,否则美颜效果不会生效。 -
在代理方法
onNERtcEngineVideoFrameCaptured:rotation:
中,将原始视频图像数据通过回调发给相芯美颜的接口,做相应的美颜处理。 -
调用相芯美颜的
renderPixelBuffer
接口,从 NERTC 回调中获取原始视频图像数据,对视频图像数据进行美颜处理,m美颜后的视频数据再通过参数返回给 NERTC 代理。该接口中的相关参数说明如下表所示。参数 说明 pixelBuffer 将 NERtc SDK 回调的每帧 pixelBuffer 图像,直接传入进行处理。 frameid 需要开发者自行维护,每调用完该接口就要 +1,否则无法驱动其中的特效动画。 items 各种类型资源的 ID,默认情况下没有创建资源时,数组中的 ID 值为 0。
示例代码
objcNERtcEngine *coreEngine = [NERtcEngine sharedEngine];
//初始化
NERtcEngineContext *context = [[NERtcEngineContext alloc] init];
context.engineDelegate = self;
context.appKey = @"<#请输入您的AppKey#>";
[coreEngine setupEngineWithContext:context];
// 配置音视频引擎,将摄像头采集的数据回调给用户
NSDictionary *params = @{
kNERtcKeyVideoCaptureObserverEnabled: @YES // 将摄像头采集的数据回调给用户
};
[coreEngine setParameters:params];
//开启本地视频采集
[coreEngine enableLocalVideo:YES streamType:kNERtcStreamChannelTypeMainStream];
// 在代理方法中对视频数据进行处理
- (void)onNERtcEngineVideoFrameCaptured:(CVPixelBufferRef)bufferRef rotation:(NERtcVideoRotationType)rotation
{
// 对视频数据 bufferRef 进行处理, 务必保证 CVPixelBufferRef 的地址值不变,分辨率不变
}
步骤5 设置美颜效果
美颜、美妆、滤镜、贴纸效果的具体参数设置,请参见 Faceunity Nama 相关文档。
关于管理美颜资源的建议
-
各种类型资源的 ID,在创建时由相芯美颜 SDK 的接口返回,因此在集成时定义一个枚举来区分各种类型的资源,会更加方便维护。
typedef NS_ENUM(NSUInteger, FUNamaHandleType) { FUNamaHandleTypeBeauty = 0, /* items[0] ------ 美颜道具句柄 */ FUNamaHandleTypeItem = 1, /* items[1] ------ 普通道具句柄(包含很多,如:贴纸,aoimoji...若不单一存在,可放句柄集其他位置) */ FUNamaHandleTypeFxaa = 2, /* items[2] ------ fxaa抗锯齿道具句柄 */ FUNamaHandleTypeMakeupLight = 3, /* items[3] ------ 质感美颜 */ FUNamaHandleTypeMakeup = 4, /* items[4] ------ 美妆道具句柄 */ }; static NSUInteger const kFUNamaHandleCount = 5; int m_fuItems[kFUNamaHandleCount];
-
除了美颜道具可以长期持有,其他道具例如贴纸、animoji、AR 面具等都属于普通道具,因此使用时,需要创建新的道具,再销毁同类型的其他道具。
// 创建美颜相关资源 NSString *beautyPath = [[NSBundle mainBundle] pathForResource:@"face_beautification" ofType:@"bundle"]; m_fuItems[FUNamaHandleTypeBeauty] = [FURenderer itemWithContentsOfFile:beautyPath];
相关文档
如果您使用呼叫组件集成 NERTC,集成相芯美颜的方法请参见集成呼叫组件和第三方美颜。
API 参考
方法 | 功能描述 |
---|---|
enableLocalVideo |
开启本地视频采集。 |
setParameters |
设置摄像头采集数据的回调。 |
onNERtcEngineVideoFrameCaptured:rotation: |
视频帧数据回调。 |
常见问题
Q1:iOS 支持的最低系统版本是多少?
推荐使用 iOS 9.0 及以上版本。
Q2:OpenGL ES环境需要如何配置?
在初始化方法 setupWithData
中,最后一个参数 shouldCreateContext
建议设为 YES
。这样的话相芯 SDK 会创建专属的 context,保持渲染资源与 NERTC SDK 相互独立,避免相互影响。