通过阅读本文,您可以了解阿里云RTC SDK对接RACE美颜的集成方式、接口说明和实现步骤。

集成RACE SDK

支持pods与本地集成两种方式。

  • pods集成方式:
    pod 'AliyunRace', '1.0.0.12196201'
  • 本地集成方式:

    获取AliyunRace.framework、Face3D.framwork、opencv2.framework文件并添加到工程中。

    说明 请您正确添加动态库Embed Frameworks。

RTC SDK对接RACE接口说明

以下为RTC SDK对接RACE时需要使用的接口说明,RACE美颜SDK中的其他接口不在本文说明。

API 描述
aliyun_beautify_create 创建美颜美型实例
aliyun_beautify_setFaceDebug 美颜美型调试开关
aliyun_setLogLevel 设置输出日志等级
aliyun_beautify_setSkinBuffing 设置磨皮等级
aliyun_beautify_setSharpen 设置锐化等级
aliyun_beautify_setSkinWhitening 设置美白等级
aliyun_beautify_setFaceSwitch 美型开关
aliyun_beautify_setFaceShape 设置美型等级
aliyun_beautify_processTextureToTexture 美颜美型纹理输入渲染
aliyun_beautify_destroy 销毁美颜美型实例
  • aliyun_beautify_create:创建美颜美型实例。
    int aliyun_beautify_create(race_t *handle);
    参数 类型 描述
    context Context 上下文

    返回值:成功返回0,失败返回<0。

  • aliyun_beautify_setFaceDebug:美颜美型调试开关。
    int aliyun_beautify_setFaceDebug(race_t handle, bool enable);
    参数 类型 描述
    handle race_t 美颜美型句柄
    enable bool 调试开启标志

    返回值:成功返回0,失败返回<0。

  • aliyun_setLogLevel:设置输出日志等级。
    void aliyun_setLogLevel(int level);
    参数 类型 描述
    level int 日志等级
  • aliyun_beautify_setSkinBuffing:设置磨皮等级。
    int aliyun_beautify_setSkinBuffing(race_t handle, float level);
    参数 类型 描述
    handle race_t 美颜美型句柄
    level float 磨皮等级,范围:0~1

    返回值:成功返回0,失败返回<0。

  • aliyun_beautify_setSharpen:设置锐化等级。
    int aliyun_beautify_setSharpen(race_t handle, float level);
    参数 类型 描述
    handle race_t 美颜美型句柄
    level float 锐化等级,范围:0~1

    返回值:成功返回0,失败返回<0。

  • aliyun_beautify_setSkinWhitening:设置美白等级。
    int aliyun_beautify_setSkinWhitening(race_t handle, float level);
    参数 类型 描述
    handle race_t 美颜美型句柄
    level float 美白等级,范围:0~1

    返回值:成功返回0,失败返回<0。

  • aliyun_beautify_setFaceSwitch:美型开关。
    void aliyun_beautify_setFaceSwitch(race_t handle, bool switchOn);
    参数 类型 描述
    handle race_t 美颜美型句柄
    switchOn bool 是否开启人脸检测及美型处理,取值:true|false
  • aliyun_beautify_setFaceShape:设置美型等级。
    int aliyun_beautify_setFaceShape(race_t handle, ALRFaceShape type, float level);
    参数 类型 描述
    handle race_t 美颜美型句柄
    type ALRFaceShape 美型类型
    level float 美型等级,可以超出ALRFaceShape中定义的参数范围

    返回值:成功返回0,失败返回<0。

    ALRFaceShape 定义和建议范围如下:
    typedef enum ALRFaceShape
    {
        ALR_FACE_TYPE_CUT_CHEEK       = 0,//颧骨,取值:0~1
        ALR_FACE_TYPE_CUT_FACE        = 1,//削脸,取值:0~1
        ALR_FACE_TYPE_THIN_FACE       = 2,//瘦脸,取值:0~1
        ALR_FACE_TYPE_LONG_FACE       = 3,//脸长,取值:0~1
        ALR_FACE_TYPE_LOWER_JAW       = 4,//下巴缩短,取值:-1~1
        ALR_FACE_TYPE_HIGHER_JAW      = 5,//下巴拉长,取值:-1~1
        ALR_FACE_TYPE_THIN_JAW        = 6,//瘦下巴,取值:-1~1
        ALR_FACE_TYPE_THIN_MANDIBLE   = 7,//瘦下颌,取值:0~1
        ALR_FACE_TYPE_BIG_EYE         = 8, //大眼,取值:0~1
        ALR_FACE_TYPE_EYE_ANGLE1      = 9,//眼角1,取值:0~1
        ALR_FACE_TYPE_CANTHUS         = 10,//眼距,取值:-1~1
        ALR_FACE_TYPE_CANTHUS1        = 11,//拉宽眼距,取值:-1~1
        ALR_FACE_TYPE_EYE_ANGLE2      = 12,//眼角2,取值:-1~1
        ALR_FACE_TYPE_EYE_TDANGLE     = 13,//眼睛高度,取值:-1~1
        ALR_FACE_TYPE_THIN_NOSE       = 14,//瘦鼻,取值:0~1
        ALR_FACE_TYPE_NOSE_WING       = 15,//鼻翼,取值:0~1
        ALR_FACE_TYPE_NASAL_HEIGHT    = 16,//鼻长,取值:-1~1
        ALR_FACE_TYPE_NOSE_TIP_HEIGHT = 17,//鼻头长,取值:-1~1
        ALR_FACE_TYPE_MOUTH_WIDTH     = 18,//唇宽,取值:-1~1
        ALR_FACE_TYPE_MOUTH_SIZE      = 19,//嘴唇大小,取值:-1~1
        ALR_FACE_TYPE_MOUTH_HIGH      = 20,//唇高,取值:-1~1
        ALR_FACE_TYPE_PHILTRUM        = 21, //人中
        ALR_FACE_TYPE_MAX             = 22
    } ALRFaceShape;
  • aliyun_beautify_processTextureToTexture:美颜美型纹理输入渲染。
    int aliyun_beautify_processTextureToTexture(race_t handle,
                                                uint32_t textureIn,
                                                uint32_t width,
                                                uint32_t height,
                                                aliyun_rotation_t rotation,
                                                uint8_t flags);
    参数 类型 描述
    handle race_t 美颜美型句柄
    textureIn uint32_t 输入图像纹理
    width uint32_t 输入图像纹理宽度
    height uint32_t 输入图像纹理高度
    rotation aliyun_rotation_t 输入图像纹理旋转角度(顺时针),RTC 对接时该参数必须设置为ALR_ROTATE_180_CW
    flags uint8_t RTC对接时该参数必须设置为0

    返回值:成功返回美颜处理后的textureId,失败返回<0。

  • aliyun_beautify_destroy:销毁美颜美型实例。
    void aliyun_beautify_destroy(race_t handle);
    参数 类型 描述
    handle race_t 美颜美型句柄

对接RACE美颜

  1. 设置RTC Engine美颜通道。

    RTC中使用外置美颜功能时,必须打开Engine的美颜通道。美颜通道的打开是通过在AliRtcEngine sharedInstance的第二个参数extra中添加user_specified_video_preprocess扩展字段,并设置为TRUE

    #pragma mark extras配置
    - (NSString *)serializeExtrasJson {
        NSMutableDictionary *extrasDic = [[NSMutableDictionary alloc] init];
        [extrasDic setValue:@"TRUE" forKey:@"user_specified_video_preprocess"];
    
        if (extrasDic.count == 0) {
            return @"";
        }
        NSError *parseError = nil;
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:extrasDic options:NSJSONWritingPrettyPrinted error:&parseError];
        return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    }
    
     _engine = [AliRtcEngine sharedInstance:self extras:extras];
  2. 订阅RTC本地预览Texture回调。

    在调用接口startPreview(本地预览开启)之后,调用subscribeVideoTexture订阅opengl纹理数据。uid填写为英文半角双引号(""),videoSource填写为AliRtcVideosourceCameraLargeType,videoTextureType填写为AliRtcVideoTextureTypePre。

    // 开启本地预览
    [self.engine startPreview];
    [self.engine subscribeVideoTexture:@"" videoSource:AliRtcVideosourceCameraLargeType videoTextureType:AliRtcVideoTextureTypePre];    /* 美颜订阅openGL纹理数据 */
  3. RTC SDK Texture回调对接RACE美颜。
    订阅本地预览Texture成功后, RTC SDK会触发以下三个回调:
    • onVideoTextureCreated:Texture创建回调。在该回调中创建和初始化RACE美颜句柄。
      - (void)onVideoTextureCreated:(NSString *)uid videoTextureType:(AliRtcVideoTextureType)videoTextureType context:(void *)context
      {
          if(aliRaceBuautyHandle){
              aliyun_beautify_destroy(aliRaceBuautyHandle);
              aliRaceBuautyHandle = nullptr;
          }
      
          aliyun_beautify_create(&aliRaceBuautyHandle);
          aliyun_beautify_setFaceSwitch(aliRaceBuautyHandle, true);
          aliyun_setLogLevel(ALR_LOG_LEVEL_ERROR);
      
          //如需初始化美颜参数请编写代码
          SkinBuffing = 1;
          Sharpen = 1;
          SkinWhitening = 0.5;
          aliyun_beautify_setSkinBuffing(aliRaceBuautyHandle, SkinBuffing);
          aliyun_beautify_setSharpen(aliRaceBuautyHandle, Sharpen);
          aliyun_beautify_setSkinWhitening(aliRaceBuautyHandle, SkinWhitening);
      }
    • onVideoTexture:Texture渲染回调。

      在该回调中,调用RACE接口aliyun_beautify_processTextureToTexture进行每一帧的美颜处理。

      注意 请您判断处理返回值textureId是否有效,返回textureId<0时该回调必须要返回参数中原始textureId。磨皮、锐化、美白等级的控制,请您在该回调中美颜处理前调用相关的接口。
      - (int)onVideoTexture:(NSString *)uid videoTextureType:(AliRtcVideoTextureType)videoTextureType textureId:(int)textureId width:(int)width height:(int)height rotate:(int)rotate extraData:(long)extraData{
      
          if (beautifySwitchOn == NO) {
              return textureId;
          }
      
          aliyun_beautify_setSkinBuffing(aliRaceBuautyHandle, SkinBuffing);
          aliyun_beautify_setSharpen(aliRaceBuautyHandle, Sharpen);
          aliyun_beautify_setSkinWhitening(aliRaceBuautyHandle, SkinWhitening);
          int texId = aliyun_beautify_processTextureToTexture(aliRaceBuautyHandle,textureId,width,height,ALR_ROTATE_180_CW,0);
      
          if(texId<0) {
             texId = textureId;
          }
          return texId;
      }
    • onVideoTextureDestory:Texture销毁回调。在该回调中执行RACE美颜SDK销毁相关的工作。
      - (void)onVideoTextureDestory:(NSString *)uid videoTextureType:(AliRtcVideoTextureType)videoTextureType{
      
          if(aliRaceBuautyHandle){
              aliyun_beautify_destroy(aliRaceBuautyHandle);
              aliRaceBuautyHandle = nullptr;
          }
      }
  4. RACE美颜控制。

    基础美颜控制:磨皮、锐化、美白。基础美颜控制必须在onVideoTexture回调中调用aliyun_beautify_processTextureToTexture之前进行设置。

    人脸检测和美型控制:如果需要打开人脸美型高级功能,通过接口aliyun_beautify_setFaceSwitch打开开关,有关美型类别的等级设置可以通过接口aliyun_beautify_setFaceShape进行设置。

    说明 当您不使用人脸美型功能时,请不要打开此功能,否则会有性能损耗。
  5. 取消订阅RTC本地预览Texture回调。

    在关闭本地预览前取消订阅本地预览texture回调。

    [self.engine unSubscribeVideoTexture:@"" videoSource:AliRtcVideosourceCameraLargeType videoTextureType:AliRtcVideoTextureTypePre];
    [self.engine stopPreview];