相芯美颜

更新时间: 2025/06/11 16:45:39

网易云信 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. 将证书文件 authpack.h 放到本地项目的 Beauty 目录下。

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

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

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

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

      pod install
      

第二步:初始化相芯美颜 SDK

C++// 引入头文件
#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];

第三步:视频图像处理

  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;
    }
    

第四步:设置美颜效果

美颜、美妆、滤镜、贴纸效果的具体参数设置,请参考 Faceunity Nama 相关文档

第五步:管理美颜资源

关于管理美颜资源的建议如下:

  • 各种类型资源的 ID,在创建时由相芯美颜 SDK 的接口返回,因此在集成时定义一个枚举来区分各种类型的资源,会更加方便维护。

    C++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 面具等都属于普通道具,因此使用时,需要创建新的道具,再销毁同类型的其他道具。

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

API 参考

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

常见问题

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

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

OpenGL 环境需要如何配置?

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

使用美颜后画面会闪一下,怎么办?

  • 可能原因:相芯 7.x.x 版本 SDK 前 5 帧存在渲染问题。

  • 解决方案

    • 升级相芯版本至 8.x.x 版本。
    • 若不想升级相芯版本,在美颜处理时,建议您丢弃前 5 帧。

使用美颜后画面出现闪屏、黑屏,怎么办?

  • 可能原因:美颜拿到了采集的过程数据没拿到结果数据。
  • 解决方案
    • 初始化相芯 SDK 时,调用 fuSetUseTexAsync(true) 方法。
    • 升级 NERTC SDK 至 4.6.50 及以后的版本。详情请参考 升级指南

使用美颜后出现画面卡顿,怎么办?

  • 可能原因 1:采集帧率设置太高,例如 30 帧,美颜也会按照 30 帧率进行处理。在一些低端机上,高帧率会对整个系统产生较大的压力,美颜处理时间可能会超过每一帧预期的帧间隔,引发画面卡顿。

  • 解决方案:降低采集帧率,在 NERTC SDK 的视频配置中,将帧率设置为 15。

  • 可能原因 2:相芯 SDK 日志级别太低,导致每处理一帧都会打印大量日志,影响整体性能。

  • 解决方案:在初始化时,关闭相芯 SDK 日志,将日志级别设置为 OFF

    C++fuSetLogLevel(FU_LOG_LEVEL_OFF);
    
此文档是否对你有帮助?
有帮助
去反馈
  • 准备工作
  • 功能原理
  • 注意事项
  • 示例项目源码
  • 第一步:集成相芯美颜
  • 第二步:初始化相芯美颜 SDK
  • 第三步:视频图像处理
  • 第四步:设置美颜效果
  • 第五步:管理美颜资源
  • API 参考
  • 常见问题
  • macOS 支持的最低系统版本是多少?
  • OpenGL 环境需要如何配置?
  • 使用美颜后画面会闪一下,怎么办?
  • 使用美颜后画面出现闪屏、黑屏,怎么办?
  • 使用美颜后出现画面卡顿,怎么办?