相芯美颜
更新时间: 2025/06/11 16:45:39
网易云信 NERTC SDK 支持接入相芯等第三方专业美颜滤镜厂商,实现美颜、美妆、滤镜、贴纸等美颜特效。在娱乐社交、在线教育等场景中,您可以快速构建具备美颜特效能力的应用,让用户在进行视频通话或直播时,呈现更良好的肌肤状态和精神面貌。
相芯美颜(Faceunity Nama SDK,下文简称 Nama SDK)的详细功能介绍请参考 人脸特效。
准备工作
根据本文操作前,请确保您已经完成了以下设置:
- 下载相芯美颜 SDK。
- 获取相芯美颜 SDK 的证书,具体请联系网易云信商务经理。
- 获取相芯美颜资源文件,具体请联系网易云信商务经理。
功能原理
-
NERTC SDK 提供了
onCaptureVideoFrame采集数据回调的接口,将采集到的视频图像数据通过该接口回调出来。 -
Nama SDK 通过回调获取视频图像数据,进行美颜处理后,通过参数返回给 NERTC SDK。
-
NERTC SDK 将美颜后的数据进行编码和传输。
注意事项
onCaptureVideoFrame 回调必须同步返回,且保证 data 的地址值不被改变,分辨率不改变。
示例项目源码
网易云信提供 第三方美颜的示例项目源码,您可以参考该源码实现第三方美颜。
第一步:集成相芯美颜
-
将证书文件
authpack.h放到本地项目的Beauty目录下。 -
将所需的美颜模型和道具放到本地项目的
Resource目录下。 -
通过 Cocoapods 集成相芯美颜 SDK。
-
在 podfile 中添加以下代码。
pod 'Nama-macOS', '7.3.0' -
在 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];
第三步:视频图像处理
-
调用
setParameters接口,将kNERtcKeyEnableVideoCaptureObserver的值设置为YES,开启摄像头采集数据的回调。- V5.3.0 及之后版本需要执行该步骤。
- V4.6.X 版本请忽略该步骤。
-
在成功加入房间后,调用
enableLocalVideo方法开启本地视频采集,并设置NERtcVideoStreamType为kNERTCVideoStreamMain,否则美颜效果不会生效。 -
在代理方法
onCaptureVideoFrame中,将原始视频图像数据通过回调发给相芯美颜的接口,做相应的美颜处理。相关参数的含义如下:
参数名称 参数含义 data 采集视频数据 type 视频类型 width 视频宽度。 height 视频高度 count 视频 plane count offset 视频 offset stride 视频 stride rotation 视频旋转角度 -
调用相芯美颜的
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 及以后的版本。详情请参考 升级指南。
- 初始化相芯 SDK 时,调用
使用美颜后出现画面卡顿,怎么办?
-
可能原因 1:采集帧率设置太高,例如 30 帧,美颜也会按照 30 帧率进行处理。在一些低端机上,高帧率会对整个系统产生较大的压力,美颜处理时间可能会超过每一帧预期的帧间隔,引发画面卡顿。
-
解决方案:降低采集帧率,在 NERTC SDK 的视频配置中,将帧率设置为 15。
-
可能原因 2:相芯 SDK 日志级别太低,导致每处理一帧都会打印大量日志,影响整体性能。
-
解决方案:在初始化时,关闭相芯 SDK 日志,将日志级别设置为
OFF。C++fuSetLogLevel(FU_LOG_LEVEL_OFF);





