Android:Uniapp平台中接入即构RTC+相芯美颜

0 前言

前阵子使用Uniapp平台开发了一个跨平台app,并且接入了即构RTC后,今天想进一步丰富app的直播功能。之前有相芯美颜的开发经验,打算将相芯美颜接入即构RTC.

**在DCloud插件市场找到了在即构RTC接入相芯美颜插件,https://ext.dcloud.net.cn/plugin?id=18718, 按照里面的readme教程完成接入,**为了让后来者少走弯路,将接入过程以及原理记录到本文中,欢迎大家评论讨论。最终实现的效果如下:
在这里插入图片描述

1 配置准备

先加入在DCloud插件市场中加入两个插件, 分别点击如下两个链接:

  1. 即构RTC接入相芯美颜插件
  2. ZEGO 即构实时音视频 SDK

然后分别点击"点击购买(0元)for 云打包", 如下图所示:

在这里插入图片描述

接下来在HBuilder的App原生插件上加入以上两个插件,如下所示:

在这里插入图片描述

2 代码开发

本文基于即构RTC接入相芯美颜插件的示例项目开发,前往即构RTC接入相芯美颜插件官网下载示例项目ZIP,如下图所示:

在这里插入图片描述

2.1 即构与相芯秘钥配置

打开pages/KeyCenter.js, 填写以下内容:

let appID = ;
let userID =   
let appSign =  
let token = 
let authpack = 

以上各个配置参数通过如下途径获取:

  1. appID:打开即构后台管理https://console.zego.im/dashboard,可以得到appID, 形如123456789。
  2. userID:随意定义的字符串,作为当前登录用户的id
  3. appSign:旧的鉴权方式需要使用,建议参考https://doc-zh.zego.im/faq/token_upgrade 切换到最新的鉴权。用户可以从https://console.zego.im/dashboard 获取appSign,注意以后不再提供appSign支持。
  4. token:最新的鉴权方案,参考这里https://doc-zh.zego.im/faq/token_upgrade
  5. authpack:由相芯对接工作人员提供生成代码,可以运行保存下来。相芯提供类似如下代码:
public class authpack {public static int sha1_32(byte[] buf){int ret=0;try{byte[] digest=MessageDigest.getInstance("SHA1").digest(buf);return ((int)(digest[0]&0xff)<<24)+((int)(digest[1]&0xff)<<16)+((int)(digest[2]&0xff)<<8)+((int)(digest[3]&0xff)<<0);}catch(Exception e){}return ret;}public static byte[] A(){byte[] buf=new byte[1266];int i=0;for(i=-61;i<-59;i++){ buf[0]=(byte)i; if(sha1_32(buf)==-1001144934){break;} }//-------------------//...此处重复格式代码略....//------------------//for(i=80;i<88;i++){ buf[1265]=(byte)i; if(sha1_32(buf)==382609747){break;} }return buf;}
}

得到上面代码后,调用authpack.A()得到byte[]对象,将数组里面的值打印出来。得到类似如下数据,直接复制出来,设置给authpack。

[-61, -114, -2, -31, -43, 62, -112, -87, -120, 81, -93, 78, -55, -25, -20, 44, -29, -100, -98, 35, 112, -94, 58, 67, 57, -21, 59, -110, 56, -56, -73, -118, 57, -48, -9, -83, 80, 121, 58, 124, -107, -53, 38, -106, -58,-85, 35, -39, 61, 119, -54, 31, 69, -95, 88, -16, 35, -18, 74, 20, -18, 15, 110, 93, -80, -44, 10, -12, 68, -59,-108, 110, -83, -13, -34, -80, -67, -105, 55, 74, 105, 14, -36,.................]

2.2 开启美颜

打开pages/index/index.nvue引入如下几个库:

import ZGFUBeautyWrapper from "@/components/Zego-FUBeautyWrapper/lib/ZGFUBeautyWrapper";
import ZegoFU from "@/components/Zego-FUBeautyWrapper/ZegoFU";
import FaceBeautyEnum from "@/components/Zego-FUBeautyWrapper/FaceBeautyEnum";

接下来开启美颜

//初始化美颜相关操作
let self = this;
let authpack = KeyCenter.getAuthPack();
ZegoFU.initZgAndRegisterFu(authpack, function(succ, msg) {self.initReady = succ;if (!succ) {console.log(msg)} else {console.log("已完成必要的SDK初始化,注意后面释放RTC引擎的同时,也要关闭美颜!!!")console.log("一切ready,接下来可以登录房间...")}
});

一切ready后,就可以调用相芯美颜了,相芯美颜的调用主要关注3个地方:美颜类型、美颜名称、美颜强度。美颜类型主要有3个:美肤、美肤、滤镜,每个美颜类型下有不同的美颜方法如:瘦脸、美牙等。可以通过如下方式实现:

//切换美肤、美型、滤镜tab
onClkFuTab(idx) { this.fuSelIdx = idx;if (idx == 0) {this.curFuList = FaceBeautyEnum.skinList;this.fuIsFilter = false;} else if (idx == 1) {this.curFuList = FaceBeautyEnum.shapeList;this.fuIsFilter = false;} else {this.curFuList = FaceBeautyEnum.filterList;this.fuIsFilter = true;}
}
//设置美颜名称 
setFuParam(fuEnName, fuCnName) { this.fuSelCnName = fuCnName;this.fuSelEnName = fuEnName; 
}
//拖拉条设置美颜强度
sliderChange(e) {let v = e.detail.value / 100.0; if (v >= 0 && v <= 1)ZegoFU.setFUParam(this.fuSelEnName, v, this.fuIsFilter).then(function(c) {console.log(this.fuSelEnName, v, c, this.fuIsFilter ? "setFilter" : "updateParamIntensity")})else {console.log("无效值,过滤" + c);}
}

2.3 关闭美颜

最后记得,在不使用美颜的时候要记得关闭美颜。防止出现绑定美颜异常。尤其是在即构RTC引擎被destroy时:

// 销毁引擎
destroyEngine() {this.appendActionInfo("Destroy Engine");this.logoutRoom(this.roomID);ZegoExpressEngine.destroyEngine();this.engine = null/*** 记得要关闭美颜引擎**/ZGFUBeautyWrapper.closeBeauty().then(function(code) {console.log("closeBeauty " + code)})
},

3 Native层相芯美颜接入即构RTC的基本原理

美颜可以看成是一种自定义的图像处理算法,即构RTC接入自定义图像处理流程如下:

在这里插入图片描述

具体来说,使用即构RTC的setCustomVideoProcessHandler函数,传入IZegoCustomVideoProcessHandler对象,该对象里面onCapturedUnprocessedTextureData函数传入的是当前摄像头采集的纹理ID(可以理解为opengl中的纹理id),返回的是用户自定义算法处理完成后的纹理id。参考示例如下:

// 自定义前处理为示例
// 回调方法获取原始数据
// 回调处理
// Effect 初始化反初始化在 Express 视频前处理开始停止回调里
express.setCustomVideoProcessHandler(new IZegoCustomVideoProcessHandler() {@Overridepublic void onStart(ZegoPublishChannel channel) {effects.initEnv(720, 1280);}// 一定要反初始化,否则会造成内存泄露@Overridepublic void onStop(ZegoPublishChannel channel) {effects.uninitEnv(); }// 回调方法获取原始数据 texture@Overridepublic void onCapturedUnprocessedTextureData(int textureID, int width, int height, long referenceTimeMillisecond, ZegoPublishChannel channel) {ZegoEffectsVideoFrameParam param = new ZegoEffectsVideoFrameParam();param.format = ZegoEffectsVideoFrameFormat.RGBA32;param.width = width;param.height = height;// 自定义前处理:此处使用 ZEGO Effects SDKint processedTextureID = effects.processTexture(textureID, param);// 将处理后的 buffer 发回 ZEGO Express SDK 里express.sendCustomVideoProcessedTextureData(processedTextureID, width, height, referenceTimeMillisecond);}
}

4 结尾

本文参考了DCloud中即构RTC接入相芯美颜插件的示例工程,里面提供了调用细节代码,读者可以多多挖掘,尤其是components/Zego-FUBeautyWrapper里的Uniapp调用封装,可以拿来借鉴相关思路扩展到其他类似项目中

5 结尾

结尾贴上插件链接,感兴趣的朋友可以自行下载体验:
最后附上本文参考的相关资料:

  • 即构RTC接入相芯美颜插件: https://ext.dcloud.net.cn/plugin?id=18718
  • ZEGO 即构实时音视频 SDK:https://ext.dcloud.net.cn/plugin?id=3617
  • 即构RTC接入美颜:https://doc-zh.zego.im/article/11257
  • 即构RTC-uniapp端:https://doc-zh.zego.im/article/7775

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/392074.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CasaOS系统小主机Docker部署memos结合内网穿透打造私有云笔记

文章目录 前言1. 使用Docker部署memos2. 注册账号与简单操作演示3. 安装cpolar内网穿透4. 创建公网地址5. 创建固定公网地址 前言 本文主要介绍如何在CasaOS轻NAS系统设备中使用Docker本地部署开源云笔记服务memos&#xff0c;并结合cpolar内网穿透工具配置公网地址&#xff0…

50etf期权怎么可以买跌做空吗?

50ETF期权可以做买方也可以做卖方&#xff0c;并且50ETF期权还能够买涨买跌双向交易&#xff0c;50ETF期权可以看涨期权和看跌期权&#xff0c;所以50ETF期权是可以买跌做空的&#xff0c;并且50ETF期权是很适合进行做空操作的&#xff0c;下文为大家介绍50etf期权怎么可以买跌…

SQL进阶技巧:Hive如何巧解和差计算的递归问题?【应用案例2】

目录 0 问题描述 1 数据准备 2 问题分析 3 小结 0 问题描述 累计值分析模型是一种用于分析和预测累计值数据的统计模型。它主要用于处理随时间积累的数据,例如销售额、用户数量、网站访问量等。累计值分析模型的目的是通过对历史数据的分析,揭示数据的趋势和模式,以便进…

日撸Java三百行(day13:链表)

目录 一、链表的基础知识 二、链表的代码实现 1.链表创建 2.链表遍历 3.链表定位查找 4.链表插入 5.链表删除 6.数据测试 7.完整的程序代码 总结 一、链表的基础知识 在之前顺序表的学习中&#xff0c;我们其实提到过链表。链表它是线性表在不同的物理存储方式下派生…

谷歌账号被停用后,申诉没有反馈或者被拒绝后怎么办?附:谷歌账号申诉信要点和模板

有一些朋友在登录谷歌账号的时候&#xff0c;或者在是用谷歌账号的过程中突然被强制退出来&#xff0c;然后再次登录的时候就遇到了下面的提醒&#xff1a;您的账号已停用&#xff0c;而且原因通常是两大类&#xff1a;1&#xff09;谷歌账号与其他多个账号一起创建或使用的&am…

将网络变压器(Ethernet Transformer)从千兆单口设计改为百兆双口设计涉及几个关键步骤和注意事项

变压器选型&#xff1a; 确保选用的变压器支持1000BASE-T到100BASE-TX的转换。通常&#xff0c;这种变压器会有额外的电气特性&#xff0c;如抑制和隔离等&#xff0c;以确保数据传输的可靠性和稳定性。 端口连接&#xff1a; 对于千兆单口设计&#xff0c;通常会有一对输入和输…

【python报错已解决】`AttributeError: ‘DataFrame‘ object has no attribute ‘ix‘`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言&#xff1a; 在使用Pandas库进行数据分析时&#xff0c;你是否遇到过AttributeError: DataFrame object has no attribut…

本地安装Llama3.1与LobeChat可视化UI界面并实现远程访问大模型实战

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

企业定制AI智能名片微信小程序在私域流量运营中的应用与策略

摘要&#xff1a;随着2022年私域运营市场步入冷静期&#xff0c;企业逐渐从盲目模仿向精准化、个性化的运营模式转变。在这一背景下&#xff0c;企业定制AI智能名片微信小程序凭借其独特的智能化、便捷化特性&#xff0c;成为企业构建私域流量池、深化用户关系、实现高效转化的…

【完美解决】正点原子Linux开发板无法联网ping通百度但可以ping通主机和虚拟机,联通了局域网但无法联通互联网,DNS配置问题

问题记录 主机通过共享网络给以太网口想让正点原子的阿尔法Linux开发板连上网&#xff0c;网络配置过程如下&#xff1a; 开发板连接的是eth1口&#xff0c;通过在终端输入以下命令进入网络配置文件。 vi /etc/network/interfaces 将其配置为了以下地址 但是出现了一些问题&…

RAG 入门指南:从零开始构建一个 RAG 系统

本文正文字数约 3300 字&#xff0c;阅读时间 10 分钟。 从零开始构建一个应用可以让我们快速理解应用的各个部分。 这个方法其实非常适用于 RAG。 我在以前的文章中有介绍过 RAG 的概念、原理以及应用等&#xff0c;但其实&#xff0c;亲自动手来构建一个 RAG 系统或许能够…

C语言指针详解(三)目录版

C语言指针详解&#xff08;三&#xff09;目录版 1、字符指针变量1.1、字符指针变量的一般应用1.2、常量字符串1.3、常量字符串与普通字符串的区别1.3.1 常量字符串的不可修改性1.3.2 常量字符串的存储 2、数组指针变量2.1、数组指针变量定义2.2、数组指针变量的初始化 3、二维…

图的DFS

LeetCode2368 受限条件下可到达节点的数目 class Solution { public:int dfs(vector<vector<int>>& g,int x,int fa){int sum1;for(int y:g[x]){if(y!fa) sumdfs(g,y,x);}return sum;}int reachableNodes(int n, vector<vector<int>>& edges, …

C语言指针(3)

目录 一、字符指针变量 二、数组指针变量 三、⼆维数组传参的本质 四、函数指针变量 五、typedef 关键字 六、函数指针数组 一、字符指针变量 字符指针char* &符号名 符号名&#xff0c;这都是获取的是首元素地址。 int main() {char a[] "abcdef";cha…

另一棵树的子树 - 力扣(LeetCode)C语言

572. 另一棵树的子树 - 力扣&#xff08;LeetCode&#xff09;&#xff08;点击前面链接即可查看题目&#xff09; 一、题目 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&…

机器学习中的关键距离度量及其应用

引言 在当今的数据驱动世界中&#xff0c;机器学习算法扮演着至关重要的角色&#xff0c;它们在图像分类、面部识别、在线内容审核、零售目录优化和推荐系统等多个领域发挥着重要作用。这些算法的核心在于它们能够识别和利用数据之间的相似性。而实现这一点的关键&#xff0c;…

ShardingSphere 内核工作原理

文章目录 内核工作原理配置管控SQL Parser: SQL解析引擎SQL Router- SQL 路由引擎SQL Rewriter : SQL 优化引擎SQL Executor &#xff1a; SQL执行引擎Result Merger&#xff1a; 结果归并 内核工作原理 ShardingSphere的整体架构图是这样的&#xff1a; 配置管控 在进入Shar…

MySQL事务,锁,MVCC总结

mysql中最重要的就是事务&#xff0c;其四大特性让我们维持了数据的平衡&#xff0c;一致。那么事务究竟是什么&#xff0c;与什么相关&#xff0c;他的使用步骤&#xff0c;以及使用过程中我们会遇到什么问题呢&#xff1f;下面我们一起学习交流! 1.MySQL的存储引擎&#xff…

SPIFFS与LittleFS的对gz文件格式的区别

SPIFFS 只能安装在Arduino上。LittleFS支持Arduino IDE和VScode的 PlatformIO。 SPIFFS serveStatic: server.serveStatic("/", SPIFFS, "/") 负责提供 SPIFFS 文件系统中的文件。您可以在 SPIFFS 上放置 .gz 文件&#xff0c;并该方法将自动处理它们。 …

git cz代码提交规范,适用于node14以上

1.效果 3. 在项目中如何添加 3.1 安装(只提供npm安装方式)全局安装 commitizen npm i -D commitlint commitlint/config-conventional commitizen cz-git 3.2 配置模版 在项目的根目录下配置添加文件 commitlint.config.js 并写入如下代码 /** type {import(cz-git).UserCo…