相芯美颜

更新时间: 2024/03/15 17:20:41

NERTC SDK 支持接入相芯等第三方专业美颜滤镜厂商,实现美颜、美妆、滤镜、贴纸等美颜特效。在娱乐社交、在线教育等场景中,您可以快速构建具备美颜特效能力的应用,让用户在进行视频通话或直播时,呈现更良好的肌肤状态和精神面貌。

相芯美颜(Faceunity Nama SDK,下文简称 Nama SDK)的详细功能介绍请参见人脸特效

准备工作

  1. 下载相芯美颜 SDK(推荐使用 V8.3.0 版本)
  2. 获取相芯美颜 SDK 的证书,具体请联系网易云信商务经理。
  3. 获取相芯美颜资源文件,具体请联系网易云信商务经理。
  4. 集成 NERTC SDK,推荐使用 NERTC V4.6.50 及以后版本,V4.6.50 版本对相芯美颜进行了优化。

功能原理

相芯美颜原理.png

  1. NERTC SDK 提供了onNERtcEngineVideoFrameCaptured: rotation: 采集数据回调的接口,将采集到的视频图像数据通过该接口回调出来。

  2. Nama SDK 通过回调获取视频图像数据,进行美颜处理后,通过参数返回给 NERTC SDK。

  3. NERTC SDK 将美颜后的数据进行编码和传输。

注意事项

  • 该设置仅在加入房间之前设置才有效。
  • 若 NERTC SDK 版本号低于3.7.0,需要在初始化 NERTC SDK 之前调用 setParameters 方法。
  • onNERtcEngineVideoFrameCaptured: rotation: 回调必须同步返回,且保证 CVPixelBufferRef 的地址值不被改变,分辨率不改变。

示例项目源码

网易云信提供第三方美颜的示例项目源码,您可以参考该源码实现第三方美颜。

实现方法

步骤1 集成相芯美颜

  1. 将证书文件 authpack.h 放到本地项目的 Beauty目录下。

  2. 将所需的美颜模型和道具放到本地项目的 Resource 目录下。

  3. 通过 Cocoapods 集成相芯美颜 SDK。

    1. 在 podfile 中添加以下代码。

      pod 'Nama', '8.3.0' 
      
    2. 在 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回调中,默认会返回视频的方向信息,进行图像处理之前,需要先使用相芯接口配置方向信息,否则一些涉及人脸识别的功能会发生异常。

  1. 创建 CMMotionManger,用于获取当前的设备方向。
self.motionManager = [[CMMotionManager alloc] init];
self.motionManager.accelerometerUpdateInterval = 0.5;// 1s刷新一次
if ([self.motionManager isDeviceMotionAvailable]) {
    [self.motionManager startAccelerometerUpdates];
    [self.motionManager startDeviceMotionUpdates];
}
  1. 在每次进行图像处理之前,判断一下当前的设备方向,并调用相芯接口配置方向信息。
// 存储当前的设备方向,默认值为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 视频图像处理

  1. 调用 setParameters 接口,将 kNERtcKeyVideoCaptureObserverEnabled 的值设置为 YES,开启摄像头采集数据的回调。

  2. 在成功加入房间后调用 enableLocalVideo 方法开启本地视频采集。

    调用 enableLocalVideo 开启本地视频采集时,请设置 streamTypekNERtcStreamChannelTypeMainStream,否则美颜效果不会生效。

  3. 在代理方法 onNERtcEngineVideoFrameCaptured:rotation: 中,将原始视频图像数据通过回调发给相芯美颜的接口,做相应的美颜处理。

  4. 调用相芯美颜的 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 相互独立,避免相互影响。

此文档是否对你有帮助?
有帮助
去反馈
  • 准备工作
  • 功能原理
  • 注意事项
  • 示例项目源码
  • 实现方法
  • 步骤1 集成相芯美颜
  • 步骤2 初始化相芯美颜 SDK
  • 步骤3 适配设备方向
  • 步骤4 视频图像处理
  • 步骤5 设置美颜效果
  • 关于管理美颜资源的建议
  • 相关文档
  • API 参考
  • 常见问题
  • Q1:iOS 支持的最低系统版本是多少?
  • Q2:OpenGL ES环境需要如何配置?