Android

腾讯美颜

更新时间: 2025/06/19 15:50:31

NERTC SDK 支持接入腾讯美颜(TEBeautyKit)SDK,实现美颜、美妆、滤镜、贴纸等丰富美颜特效。在视频社交、在线教育、直播互动等场景中,您可以快速构建具备专业美颜能力的应用,提升用户在视频通话或直播过程中的形象表现力。

功能概述

通过集成腾讯美颜 SDK,您可以在 NERTC 音视频通话中实现以下功能:

  • 智能美颜:磨皮、美白等基础美颜,以及大眼、瘦脸、V 脸、下巴调整等面部微调
  • 美妆特效:口红、眼影、腮红等美妆效果
  • 特效滤镜:多种风格滤镜,满足不同场景需求
  • 贴纸道具:丰富的 2D、3D 贴纸,增强互动趣味性

工作原理

腾讯美颜原理.png
  1. NERTC SDK 通过 setVideoCallback 接口将采集到的视频帧数据回调给应用层,应用层将视频帧传递给腾讯美颜 SDK 进行美颜处理。
  2. 腾讯美颜 SDK 处理完成后,将美颜后的视频帧返回给应用层。
  3. 应用层将美颜后的视频帧通过回调参数返回给 NERTC SDK。
  4. NERTC SDK 将美颜后的视频帧进行编码和传输。

注意事项

  • 纹理转换:由于 NERTC SDK 提供的是 OES 纹理,而腾讯美颜 SDK 需要 2D 纹理,因此需要进行纹理格式转换。
  • 图像方向:由于移动设备摄像头采集的图像方向与显示方向可能不一致,需要设置正确的图像旋转方向。
  • 线程安全:美颜处理应在 OpenGL 线程中进行,避免多线程操作导致的异常。
  • 资源释放:请务必确保在 OpenGL 线程中释放美颜资源的操作(postOnGLThread)在释放 NERTC SDK 资源(release())之前完成,否则将导致腾讯美颜资源无法正确释放,从而导致显示黑屏。详情请参考下文 第四步:资源释放

前提条件

在集成腾讯美颜 SDK 前,请确保您已完成以下准备工作:

第一步:环境集成

  1. 集成 NERTC SDK。如果您已完成本步骤,请跳过此步。

    根据 更新日志 选择 NERTC SDK 版本号,然后在项目级 build.gradle 文件中添加 NERTC SDK 依赖:

    Groovydependencies {
        implementation "com.netease.yunxin:nertc-base:5.8.20" // 请使用您项目中的实际版本
    }
    
  2. 集成腾讯美颜 SDK。

    腾讯美颜 SDK 提供了 TEBeautyKit 封装库,便于快速集成,本文后续步骤也将基于这个库进行集成:

    1. TEBeautyKit 模块拷贝到您的工程目录中。
    2. settings.gradle 文件中引入模块:
      Groovyinclude ':app'
      include ':tebeautykit'
      
    3. 在应用模块的 build.gradle 文件中添加依赖:
      Groovydependencies {
          implementation project(':tebeautykit')
      }
      

第二步:资源准备

  1. 资源文件配置。

    • 将腾讯美颜 SDK 产物 aar 内的资源文件夹(assets)复制到应用的沙盒目录中。

    • AppConfig 相关代码从腾讯美颜 SDK Demo 中拷贝即可。

      Kotlinval resPath = File(filesDir, AppConfig.getInstance().beautyFileDirName).absolutePath
      Log.i("test", "resPath = $resPath")
      TEBeautyKit.setResPath(resPath)
      
      // 在子线程中复制资源文件,避免阻塞主线程
      Thread {
          val result = TEBeautyKit.copyRes(applicationContext)
          Log.i("TEBeauty", "资源文件复制结果: $result")
      }.start()
      
  2. License 配置及初始化腾讯美颜 SDK。

    腾讯美颜 SDK 需要先验证 License 合法性,然后在验证成功的回调中创建和初始化美颜 SDK。

    Kotlin// 设置 License 并验证
    TEBeautyKit.setTELicense(applicationContext, licenseUrl, licenseKey) { errorCode, msg ->
            if (errorCode == TELicenseCheck.ERROR_OK) {
                Log.i("test", "check license ok.")
                // 创建并初始化腾讯美颜 SDK
                TEBeautyKit.create(applicationContext, XmagicConstant.EffectMode.PRO
                ) { beautyKit ->
                    this@MainActivity.mBeautyKit = beautyKit
                    //由于安卓原始预览帧的角度不是 0 度,需要给腾讯设置图像角度
                    this@MainActivity.mBeautyKit?.setImageOrientation(TEImageOrientation.ROTATION_90)
                }
            } else {
                Log.i("test", "check license failed: $msg")
            }
        }
    

第三步:视频处理流程

  1. 启动视频采集。

    在加入房间前,初始化 NERTC SDK 并启动视频采集:

    Kotlin// 初始化 NERTC SDK
    val option = NERtcOption()
    option.logLevel = NERtcConstants.LogLevel.INFO //建议生产填 INFO,上线后改为 WARN
    NERtcEx.getInstance().init(applicationContext, "your_netease_rtc_appkey", this.callback, option)
    
  2. 加入 RTC 房间,并调用 setupLocalVideoCanvas 接口设置本地视频画布:

    Kotlin//加入房间
    var ret = NERtcEx.getInstance().joinChannel("", "12345", 54321L)
    if (ret != NERtcConstants.ErrorCode.OK) {
        Log.i("test", "joinChannel result: $ret")
    }
    
    //开启摄像头,进行视频采集
    var ret = NERtcEx.getInstance().enableLocalVideo(true)
    //设置本地视频画布
    ret = NERtcEx.getInstance().setupLocalVideoCanvas(NERtcVideoStreamType.kNERtcVideoStreamTypeMain, renderView)
    
  3. 设置视频帧回调,对视频帧应用美颜效果。

    KotlinNERtcEx.getInstance().setVideoCallback({ videoFrame: NERtcVideoFrame ->
    
        if (this@MainActivity.mBeautyKit == null) {
            return@setVideoCallback false
        }
    
        if (this@MainActivity.mTransform == null) {
            this@MainActivity.mTransform = TextureTransform()
        }
    
        // 由于 NERTC SDK 提供的是 OES 纹理,而腾讯美颜 SDK 需要 2D 纹理,因此需要进行纹理格式转换
        val outputTxt = this@MainActivity.mTransform?.transferTextureToTexture(
            videoFrame.textureId,
            TextureFormat.Texture_OES,
            TextureFormat.Texture_2D,
            videoFrame.width,
            videoFrame.height,
            defaultTransition
        )
    
        //处理完转交给 NERtcSDK 处理。
        if (outputTxt != null) {
            videoFrame.textureId = this@MainActivity.mBeautyKit!!.process(outputTxt, videoFrame.width, videoFrame.height)
            videoFrame.format = NERtcVideoFrame.Format.TEXTURE_RGB
        }
        true
    }, false)
    

第四步:资源释放

在退出通话或应用退出时,需要按照正确的顺序释放资源:

Kotlin// 离开房间
NERtcEx.getInstance().leaveChannel()

// ⚠️ 重要:必须在调用 release() 之前,在 OpenGL 线程中释放美颜资源
// 否则将导致腾讯美颜资源释放失败
NERtcEx.getInstance().postOnGLThread {
    this.mTransform?.release()
    this.mBeautyKit?.onDestroy()
}

// 释放 NERTC SDK 资源,必须在美颜资源释放之后执行
NERtcEx.getInstance().release()
此文档是否对你有帮助?
有帮助
去反馈
  • 功能概述
  • 工作原理
  • 注意事项
  • 前提条件
  • 第一步:环境集成
  • 第二步:资源准备
  • 第三步:视频处理流程
  • 第四步:资源释放