首页 > 其他分享 >美颜SDK是什么?虹图美颜SDK对接开发指南

美颜SDK是什么?虹图美颜SDK对接开发指南

时间:2023-09-26 17:32:59浏览次数:30  
标签:初始化 shareInstance isMirror int 虹图 param 美颜 HTEffect SDK

美颜SDK,即提供美颜特效功能的SDK开发套件,通俗来讲就是直播、短视频中需要给用户提供美颜、滤镜、贴纸道具等能力时,自研成本大时间长,就找个第三方开发好的包,也就是美颜SDK,集成进你自己的平台。叫做美颜SDK的这个包,通常包含了美颜,美型,滤镜这些基础功能,也有贴纸道具,美妆,甚至美体等高级功能,不同厂商提供的功能和效果也各不相同。

本文记录下本次直播项目集成虹图美颜SDK的步骤

虹图美颜SDK提供的功能如下,但是我们只集成了几种的美肤、美型、风格滤镜、高级滤镜几个功能。

同时实现美颜预览页面设置参数,进入直播间直接开播的功能。

 

功能模块

功能描述

人像美颜

美肤(美白、磨皮、红润、清晰、亮度、去黑眼圈、去法令纹)

美型(瘦脸、大眼、V脸、窄脸、瘦颧骨、瘦下颌骨、丰太阳穴、小头、小脸、短脸、下巴、缩人中、发际线、眼间距、开眼角、长鼻、瘦鼻、嘴型、微笑嘴唇等)

风格滤镜(提供不少于30款滤镜)

高级滤镜功能(提供不少于15款高级光影滤镜)

特效滤镜(画面炫彩变幻效果,包括灵魂出窍、魔法镜面、水面效果等效果)

哈哈镜(多种人脸变形哈哈镜特效)

美发功能(多种发色随缘切换)

美妆(包含眉毛、腮红、眼影、眼线、睫毛、口红、美瞳等美妆特效)

妆容推荐(多种不同风格的妆容搭配一键切换)

各类效果结合美妆的组合妆容效果

美体(包含长腿、瘦身两种特效)

基于全身肢体关键点,实现长腿、瘦身效果

道具特效

贴纸+水印

3D特效

手势识别

人像抠图:绿幕抠图 + AI抠图

  

首先是跑通虹图的示例工程

 

1.创建应用

登录到用户中心控制台,进入左侧项目管理>人像人体SDK,单击创建,在弹出的对话框中输入您的应用名称和包名,并单击提交。

 

2.下载 HTEffectDemo 源码

在刚刚创建出的应用中,单击配置进入项目配置页面,单击右侧文档中心里的下载即可进入下载页面。

 

3. 配置 HTEffectDemo 工程文件

Android

下载完成后,进入 HTEffectDemo 工程,打开 app 模块的 AndroidManifest 文件,将 android:label 的值替换为您刚刚创建的应用名称。

打开 app 模块中的 build.gradle 文件,将 applicationId 的值替换为您刚刚创建的包名。

全局搜索 initHTEffect 方法,将参数 YOUR_APP_ID 修改为创建应用时生成的APP ID。

 

iOS

下载完成后,打开 HTEffectDemo 工程,将 Display Name 和 Bundle Identifier 分别替换为您刚刚创建的应用名称和包名并回车确认。

全局搜索 initHTEffect 方法,将参数 YOUR_APP_ID 修改为创建应用时生成的APP ID。

 

4. 编译运行

Android

使用 AndroidStudio (4.1及以上的版本)编译运行 HTEffectDemo 工程即可。

 

iOS

使用 Xcode(11.0及以上的版本)打开源码目录下的 HTEffectDemo.xcworkspace 工程,编译并运行 HTEffectDemo 工程即可。

 

 

跑通后就可以开始接入自己的工程了

iOS接入

1. 导入工程

将下载好的 HTEffect.framework 库文件和 HTEffect.bundle 资源包放到您的项目文件夹下。

在 Xcode > General 中添加动态库,确保 Embed 属性设置为 Embed & Sign。

在 Xcode > Build Settings 中搜索 bitcode ,将 Enable Bitcode 设置为 No。

在 Xcode > Info 中添加 App Transport Security Settings > Allow Arbitrary Loads 并设置为 YES。

 

2. 使用 HTUI (可选)

HTUI 是开源的,可根据项目需求选用。 使用 HTUI 方法如下: 将 HTUI 文件夹添加到您的项目文件夹中,导入 HTUIManager.h 并设置 HTUIManagerDelegate。

[[HTUIManager shareManager] loadToWindowDelegate:self];

 

3. 集成开发

3.1 初始化

HTEffect 的初始化函数调用一次即可生效。但由于 app 在第一次安装的时候需要获取网络权限,此时调用初始化是无法成功的,所以推荐您在 AppDelegate 中调用 initHTEffect 并设置 HTEffectDelegate 回调,待进入视频页面时判断初始化状态,若失败可再执行初始化方法,避免出现第一次安装时初始化失败。

 

 // 在线鉴权初始化方法

 [[HTEffect shareInstance] initHTEffect:@"YOUR_APP_ID" withDelegate:self];

// 离线鉴权初始化方法

[[HTEffect shareInstance] initHTEffect:@"YOUR_APP_ID"];

提示

注:项目运行后在控制台搜索 InitInfo,可查看具体的版本信息和初始化状态。

 

3.2 添加 HTUI (可选)

如果需要使用 HTUI,您可以在 viewDidLoad 中添加以下方法:

 [[HTUIManager shareManager] loadToWindowDelegate:self];

 [self.view addSubview:[HTUIManager shareManager].defaultButton];

 

3.3 渲染步骤

定义一个 BOOL 变量 isRenderInit ,用来标志渲染器的初始化状态。根据获取到的视频格式,采用对应的方法进行渲染:

 

Texture 纹理

首先调用 initTextureRenderer 初始化纹理渲染器,再调用渲染方法 processTexture。

/**

* 初始化纹理渲染器

*

* @param width    图像宽度

* @param height   图像高度

* @param rotation 图像是否需要旋转,不需旋转为CLOCKWISE_0

* @param isMirror 图像是否存在镜像

* @param maxFaces 人脸检测数目上限设置,推荐取值范围为1~5

*

* @return 返回初始化结果,成功返回true,失败返回false

*/

- (BOOL)initTextureRenderer:(int)width height:(int)height rotation:(HTRotationEnum)rotation isMirror:(BOOL)isMirror maxFaces:(int)maxFaces;

* 处理纹理数据输入

*

* @param textureId 纹理ID

*/

 

- (GLuint)processTexture:(GLuint)textureId;

 

* 使用示例

*/

if (!_isRenderInit) {

[[HTEffect shareInstance] releaseTextureRenderer];

_isRenderInit = [[HTEffect shareInstance] initTextureRenderer:width height:height rotation:rotation isMirror:isMirror maxFaces:maxFaces];

}

[[HTEffect shareInstance] processTexture:textureId];

 

CVPixelBufferRef 视频帧

首先调用 initBufferRenderer 初始化buffer渲染器,再调用渲染方法 processBuffer。

 

 

/**

* 初始化buffer渲染器

*

* @param format 图像格式

* @param width    图像宽度

* @param height   图像高度

* @param rotation 图像是否需要旋转,不需旋转为CLOCKWISE_0

* @param isMirror 图像是否存在镜像

* @param maxFaces 人脸检测数目上限设置,推荐取值范围为1~5

*

* @return 返回初始化结果,成功返回true,失败返回false

*/

- (BOOL)initBufferRenderer:(HTFormatEnum)format width:(int)width height:(int)height rotation:(HTRotationEnum)rotation isMirror:(BOOL)isMirror maxFaces:(int)maxFaces;

* 处理buffer数据输入

*

* @param buffer 视频帧数据

*/

- (void)processBuffer:(unsigned char *)buffer;

 

* 使用示例

*/

CVPixelBufferLockBaseAddress(pixelBuffer, 0);

unsigned char *buffer = (unsigned char *) CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0);

 

if (!_isRenderInit) {

 [[HTEffect shareInstance] releaseBufferRenderer];

 _isRenderInit = [[HTEffect shareInstance] initBufferRenderer:format width:width height:height rotation:rotation isMirror:isMirror maxFaces:maxFaces];

}

[[HTEffect shareInstance] processBuffer:buffer];

 

CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);

 

 

3.4 销毁

结束渲染时,需根据视频格式,调用对应的释放方法,通常写在 dealloc 方法里:

 

/**

* 销毁纹理渲染资源

*/

[[HTEffect shareInstance] releaseTextureRenderer];

 

/**

* 销毁buffer渲染资源

*/

[[HTEffect shareInstance] releaseBufferRenderer];

#3.5 资源文件

HTEffect 所有资源均支持放在用户自己的服务器,可使用以下方法进行设置:

 

 

/**

* 设置素材网络路径

* 将素材保存在自定义的网络存储中的情况下,设置网络路径

*

* @param url 素材网络路径

*/

[[HTEffect shareInstance] setResourceUrl:url];

#3.6 人脸检测功能

HTEffect 支持人脸检测功能,可通过以下方法返回人脸数量:

 

 

int faceNumber = [[HTEffect shareInstance] isTracking];

 

 

 

安卓接入

1. 导入工程

将 HTEffect.aar 文件拷贝到 app 模块中的 libs 文件夹下,并在 app 模块的 build.gradle 文件的 dependencies 中,增加如下依赖:

dependencies {

 implementation files('libs/HTEffect.aar')

}

将 jniLibs 文件夹中,各个 ABI 对应的 libHTEffect.so 文件,拷贝到对应目录中。

将 assets 资源文件拷贝到项目的对应目录中。

 

2. 使用 HTUI (可选)

HTUI 是开源的,可根据项目需求选用。 使用 HTUI 方法如下:

依赖我们的 htui 工程,使用我们提供的开源 UI 库,将 htui 文件夹拷贝到工程根目录下,在工程根目录的 settings.gradle 文件中,增加如下代码:

include(":htui")

在 app 模块中的 build.gradle 文件的 dependencies 中,增加如下代码:

implementation project(':htui')

 

3. 集成开发

3.1 初始化

HTEffect 初始化函数程序中调用一次即可生效,建议您在 Application 创建的时候调用;如果渲染功能使用不频繁,也可以在使用的时候调用,接口如下:

 

 

    // 在线鉴权初始化方法

     HTEffect.shareInstance().initHTEffect(context, "YOUR_APP_ID", new InitCallback() {

        @Override public void onInitSuccess() {}

        @Override public void onInitFailure() {}

    });

 // 离线鉴权初始化方法

  HTEffect.shareInstance().initHTEffect(context,"YOUR_APP_ID");

提示

注:项目运行后在控制台搜索 InitInfo,可查看具体的版本信息和初始化状态。

 

3.2 添加 HTUI (可选)

设置使用 htui 的 Activity 继承或间接继承 FragmentActivity,例如:

public class CameraActivity extends FragmentActivity {

 //...

}

如果需要使用 htui,请调用 addcontentView 实现UI的添加,代码如下:

 

   addContentView(

 new HTPanelLayout(this).init(getSupportFragmentManager()),

 new FrameLayout.LayoutParams(

  ViewGroup.LayoutParams.MATCH_PARENT,

  ViewGroup.LayoutParams.MATCH_PARENT));

 

3.3 渲染步骤

定义布尔变量 isRenderInit ,用来标志渲染方法是否初始化完成,然后根据得到的视频帧格式的不同,使用对应的方法进行渲染:

 

GL_TEXTURE_EXTERNAL_OES 纹理格式,首先调用渲染初始化方法 initTextureOESRenderer,当返回 true 时初始化完成;然后调用渲染方法 processTextureOES,返回值为 GL_TEXTURE_EXTERNAL_OES 类型的纹理:

 

 /**

      * 纹理渲染初始化

      *

      * @param width    纹理宽度

      * @param height   纹理高度

      * @param rotation 纹理是否需要旋转,不需旋转为CLOCKWISE_0

      * @param isMirror 纹理是否存在镜像

      * @param maxFaces 人脸检测数目上限设置,推荐取值范围为1~5

      */

 

 public boolean initTextureOESRenderer(int width, int height, HTRotationEnum rotation, boolean isMirror, int maxFaces) ;

 

   /**

      * 渲染

      *

      * @param textureOES   纹理id

      */

   public int processTextureOES(int textureOES);

 

   /**

      * 使用方法

      */

   if (!isRenderInit) {

        isRenderInit = HTEffect.shareInstance().initTextureOESRenderer(width, height, rotation, isMirror, maxFaces);

      }

      int textureId = HTEffect.shareInstance().processTextureOES(textureOES);

GL_TEXTURE_2D 纹理格式,首先调用渲染初始化方法 initTextureRenderer,当返回 true 时初始化完成;然后调用渲染方法 processTexture,返回值为 GL_TEXTURE_2D 类型的纹理:

 

   /**

      * 纹理渲染初始化

      *

      * @param width    纹理宽度

      * @param height   纹理高度

      * @param rotation 纹理是否需要旋转,不需旋转为CLOCKWISE_0

      * @param isMirror 纹理是否存在镜像

      * @param maxFaces 人脸检测数目上限设置,推荐取值范围为1~5

      */

 

 public boolean initTextureRenderer(int width, int height, HTRotationEnum rotation, boolean isMirror, int maxFaces) ;

 

   /**

      * 渲染

      *

      * @param texture2D   纹理id

      */

   public int processTexture(int texture2D);

 

   /**

      * 使用方法

      */

   if (!isRenderInit) {

        isRenderInit = HTEffect.shareInstance().initTextureRenderer(width, height, rotation, isMirror, maxFaces);

      }

      int textureId = HTEffect.shareInstance().processTexture(texture2D);

byte[] 视频帧,首先调用渲染初始化方法 initBufferRenderer ,当返回 true 时初始化完成;然后调用渲染方法 processBuffer :

 

/**

  * 初始化buffer渲染器

  *

  * @param format 图像格式

  * @param width    图像宽度

  * @param height   图像高度

  * @param rotation 图像是否需要旋转,不需旋转为CLOCKWISE_0

  * @param isMirror 图像是否存在镜像

  * @param maxFaces 人脸检测数目上限设置,推荐取值范围为1~5

  *

  * @return 返回初始化结果,成功返回true,失败返回false

  */

public boolean initBufferRenderer(HTFormatEnum format, int width, int height, HTRotationEnum rotation, boolean isMirror, int maxFaces);

 

 

  /**

  * 处理buffer数据输入

  *

  * @param buffer 视频帧数据

  */

public void processBuffer(byte[] buffer);

 

/**

   * 使用方法

   */

if (!isRenderInit) {

     isRenderInit = HTEffect.shareInstance().initBufferRenderer(format,width, height, rotation, isMirror, maxFaces);

   }

   HTEffect.shareInstance().processBuffer(buffer);

 

3.4 销毁

结束渲染时,为防止内存泄漏的发生,需根据视频帧格式的不同,调用对应的 destroy 方法释放掉资源,调用位置通常在 视频帧回调接口 的销毁处,或者是 Activity , Fragment 的生命周期结束处,同时将定义的布尔变量 isRenderInit 置为

 

/**

   * 使用其中一个

   */

     HTEffect.shareInstance().releaseTextureOESRenderer();

     HTEffect.shareInstance().releaseTextureRenderer();

     HTEffect.shareInstance().releaseBufferRenderer();

 

   /*

   * 将 bool 置为

   */

     isRenderInit = false;

 

3.5 资源文件

HTEffect 所有资源均支持放在用户自己的服务器,使用以下方法进行设置:

 

HTEffect.shareInstance().setResourceUrl(String url);

 

3.6 人脸检测功能

HTEffect支持人脸检测功能,可通过以下方法返回人脸数量

 

int faceNumber = HTEffect.shareInstance().isTracking();

 

 

总结

总而言之,使用虹图美颜SDK还是比较简单方便的,因为已经封装好很多外层的逻辑了,只需要把button移到我们自己项目要的地方就可以了。也可以实现美颜的预设置页面,预览并设置好参数,保存好后进入房间直接就是保存过的美颜参数。

 

标签:初始化,shareInstance,isMirror,int,虹图,param,美颜,HTEffect,SDK
From: https://blog.51cto.com/u_16270354/7610815

相关文章

  • 瑞芯微RK3568|SDK开发之Kernel编译
    1. Kernel手动编译1.1       kernel查询帮助 使用./build.sh -h kernel查看kernel的详细编译命令如下所示。图1.1编译内核 上图表示,单独编译kernel固件分为三步,进入kernel目录,选择默认配置文件,编译镜像。 1.2       kernel默认配置对应平台的默认配置文件由./b......
  • 瑞芯微RK3568|SDK开发之Kernel编译
    1. Kernel手动编译1.1       kernel查询帮助 使用./build.sh -h kernel查看kernel的详细编译命令如下所示。图1.1编译内核 上图表示,单独编译kernel固件分为三步,进入kernel目录,选择默认配置文件,编译镜像。 1.2       kernel默认配置对应平台的默认配......
  • 瑞芯微RK3568|SDK开发之环境安装及编译操作
    1. SDK简介一个通用 Linux SDK 工程目录包含有buildroot、app、kernel、device、docs、external 等目录。其中一些特性芯片如RK3308/RV1108/RV1109/RV1126等,会有所不同。● app:存放上层应用 app,主要是 qcamera/qfm/qplayer/settings 等一些应用程序。● buildroot:基......
  • TP6 TP8 使用阿里官方OSS SDK方法
    安装composerrequirealiyuncs/oss-sdk-php官网:GitHub-aliyun/aliyun-oss-php-sdk:AliyunOSSSDKforPHP二、PHP简单上传官网教程:如何进行字符串上传和文件上传_对象存储OSS-阿里云帮助中心引入useOSS\OssClient;useOSS\Core\OssException;上传代码publicfunctionputFi......
  • VSCode 安装插件 Unity 后,一直弹 The .NET Core SDK cannot be located
    如题。明明已经安装了.Net7.0。并且添加到了PATH中。(也就是在终端/CMD可以通过dotnet命令访问到。)但Vscode还是一直弹The.NETCoreSDKcannotbelocated。然后开始下载.Net7.0。解决方案写在了.NETRuntimeInstallTool的细节描述里。按照描述去为对应的......
  • 使用 OpenTelemetry 构建 .NET 应用可观测性(3):.NET SDK 概览
    目录前言概览opentelemetry-dotnetopentelemetry-dotnet-contribopentelemetry-dotnet-instrumentationSDK的基本使用安装依赖ResourcesResourceBuilder.CreateDefault()ResourceBuilder.CreateEmpty()TracingActivitySource&ActivityTracing模块的使用MetricsMeterProvider&......
  • 看SDK代码
    soc_feature()支持的功能在src/soc/common/feature.c中查找过程,首先看到了有soc_do_init(),从SDK入口看起sdk_init_test() ->system_init() ->soc_reset_init() ->soc_so_init()soc_do_init()中看到有soc=SOC_CONTROL(unit),因为之前追踪soc_feature()发现它就是调用的......
  • 集成赋能 | 一图搞懂石墨文档 SDK
    这是一个高度专业化分工的时代。如果你经营一家餐厅,食材可以直接市场采购,完全不需要自己种植蔬菜瓜果。如果你想开发一款AIGC产品,没有必要自己去开发大模型,调用ChatGPT、文心一言可能是更好的选择。很多时候,相较于所有的事情都“亲力亲为”,选择一家专业成熟的的供应商,反而能让我......
  • 一些H5对接微信JSSDK的问题记录
    这里给大家分享我在实际生活中总结出来的一些知识,希望对大家有所帮助一.SDK引入这里提供两套引入流程,一套是vue2.0及其他h5项目,一套是vue3.0的引入流程不懂的也可以看我之前的一篇详细流程记录--微信调用jssdk全流程详解1.js引入直接在你的页面里引入js文件就行<scriptsr......
  • 打造自己的美颜应用:使用视频直播美颜sdk的步骤
    当下,视频直播已经成为人们分享自己生活、技能和兴趣的流行方式。但是,随着竞争的加剧,提供高质量视频直播体验变得至关重要。其中一个重要因素是美颜效果,这已经成为吸引观众的重要因素之一。幸运的是,现在有许多视频直播美颜sdk可供开发人员使用,无需从头开始构建美颜功能。本文将详细......