相芯美颜

更新时间: 2024/09/18 16:26:13

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

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

准备工作

  1. 下载相芯美颜 SDK
  2. 获取相芯美颜 SDK 的证书,具体请联系网易云信商务经理。
  3. 获取相芯美颜资源文件,具体请联系网易云信商务经理。

功能原理

相芯美颜原理.png

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

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

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

注意事项

  • onCaptureVideoFrame 回调必须同步返回,且保证 data 的地址值不被改变,分辨率不改变。

示例项目源码

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

实现方法

步骤1 集成相芯美颜

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

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

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

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

      pod 'Nama-macOS', '7.3.0' 
      
    2. 在 terminal 中执行以下命令。

      pod install
      

步骤2 初始化相芯美颜 SDK

// 引入头文件
#import "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 视频图像处理

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

    • V5.3.0 及之后版本需要执行该步骤。
    • V4.6.X 版本请忽略该步骤。
  2. 在成功加入房间后,调用 enableLocalVideo 方法开启本地视频采集,并设置 NERtcVideoStreamTypekNERTCVideoStreamMain,否则美颜效果不会生效。

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

    相关参数的含义如下:

    参数名称 参数含义
    data 采集视频数据
    type 视频类型
    width 视频宽度。
    height 视频高度
    count 视频 plane count
    offset 视频 offset
    stride 视频 stride
    rotation 视频旋转角度
  4. 调用相芯美颜的 renderPixelBuffer 接口,从 NERTC 回调中获取原始视频图像数据,对视频图像数据进行美颜处理,美颜后的视频数据再通过参数返回给 NERTC 代理。该接口中的相关参数说明如下表所示。

    参数 说明
    pixelBuffer 将 NERtc SDK 回调的每帧 pixelBuffer 图像,直接传入进行处理。
    frameid 需要开发者自行维护,每调用完该接口就要 +1,否则无法驱动其中的特效动画。
    items 各种类型资源的 ID,默认情况下没有创建资源时,数组中的 ID 值为 0。

示例代码

c++std::string params("{\"enable_video_capture_observer\":1}");
rtcEngine->setParameters(params.c_str());

rtcEngine->enableLocalVideo(nertc::kNERTCVideoStreamMain, true);

void onCaptureVideoFrame(void *data,
    NERtcVideoType type,
    uint32_t width,
    uint32_t height,
    uint32_t count,
    uint32_t offset[kNERtcMaxPlaneCount],
    uint32_t stride[kNERtcMaxPlaneCount],
    NERtcVideoRotation rotation)
{
    if (type != nertc::kNERtcVideoTypeCVPixelBuffer) {
        return;
    }

    CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)data;
    [[FURenderer shareRenderer] renderPixelBuffer:pixelBuffer withFrameId:m_fuFrameID items:m_fuItems itemCount:sizeof(m_fuItems)/sizeof(int)];
    m_fuFrameID += 1;
}

步骤4 设置美颜效果

美颜、美妆、滤镜、贴纸效果的具体参数设置,请参见 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];
    
    // mac端需要额外设置
    [FURenderer itemSetParam:m_fuItems[FUNamaHandleTypeBeauty] withName:@"is_opengl_es" value:@(0)];
    
    
  • 除了美颜道具可以长期持有,其他道具例如贴纸、animoji、AR 面具等都属于普通道具,因此使用时,需要创建新的道具,再销毁同类型的其他道具。

    // 创建美颜相关资源
    NSString *beautyPath = [[NSBundle mainBundle] pathForResource:@"face_beautification" ofType:@"bundle"];
    m_fuItems[FUNamaHandleTypeBeauty] = [FURenderer itemWithContentsOfFile:beautyPath];
    

API 参考

方法 功能描述
enableLocalVideo 开启本地视频采集。
setParameters 设置摄像头采集数据的回调。
onCaptureVideoFrame 视频帧数据回调。

常见问题

Q1:macOS 支持的最低系统版本是多少?

推荐使用 macOS 10.9 及以上版本。

Q2:OpenGL 环境需要如何配置?

在初始化方法 setupWithData 中,最后一个参数 shouldCreateContext 建议设为 YES。这样的话相芯 SDK 会创建专属的 context,保持渲染资源与 NERTC SDK 相互独立,避免相互影响。

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