ZEGO 教程 | RTC + AI 视觉的最佳实践(移动端)
摘要:帮助开发者在音视频场景中快速获得 AI 视觉功能 —— 美颜、滤镜、背景抠图等。
文|即构 Native SDK 开发团队
Z世代作为社会新的消费主力,追求个性、热爱新奇事物,青睐与酷炫新奇的玩法、紧跟娱乐潮流。AI+音视频的结合,作为在音频和视频之外第三个场景玩法创新的支撑点,刚好迎合了潮流属性。
当前市场中难以找到AI视觉&音视频双能力稳定可靠的供应商,AI视觉与音视频各自的技术门槛令众多企业的技术综合能力,用户不得不对接更多的供应商,而这也让更贴合用户需求的一体化服务迟迟没有到来。
接入速度慢?
维护成本高?
响应不及时?
ZEGO 即构科技在今年6月推出了 AI 视觉产品“ZEGO Effects”,用稳定可靠的AI+音视频能力提供更便捷高效的一站式服务,解决行业痛点,基于基础的音视频服务,满足用户在音视频场景中对于美颜、滤镜、AI 特效等 AI 视觉功能的需求。
本篇文章我们将介绍如何使用 Zego 即构科技的 Express SDK 和 Effects SDK 产品,快速完成在移动端的音视频 + AI 场景的搭建。
一、概念介绍
在正式开始介绍音视频+AI场景搭建实操之前,先简单介绍下Express SDK 和 Effects SDK 的基础概念。
1、Express SDK
Express SDK 是指 ZEGO 实时音视频 SDK,能够为开发者提供便捷接入、高清流畅、多平台互通、低延迟、高并发的音视频服务,可以实现一对多,多对多的实时音视频互动,秀场直播,视频会议等场景。
2、Effects SDK
Effects SDK 是指 ZEGO AI 视觉 SDK,提供多项智能图像渲染和算法能力,包括智能美颜、AR 特效、图像分割等,可广泛应用于娱乐直播、在线教育、拍照工具等多种场景。
充分满足泛娱乐场景下各类玩法,让企业快速获得 AI+ 音视频创新能力:
美颜 —— 智能美颜、基于精准的人脸关键点监测和 3D 模型的高级美颜、自然美妆;
AR 特效 —— ZEGO Effects 提供多种 AR 特效,支持 2D/3D 贴纸,脸部贴纸,对于复杂背景,光照变化及人物夸张姿态等有极强的鲁棒性;
智能分割 —— 通过精准分割改变画面背景,用户可需求实现视频、直播场景自由变换,再辅以多样背景素材,可以实现更多有趣玩法;
百变滤镜 —— 提供多种精美滤镜,包括清新、日系、柔美、森林、光效等不同主题,可以轻松变换图像风格。
AI 视觉在音视频代码中的实现逻辑
下面我们将以 iOS,Android 端为切入点,带大家了解一下 Express SDK + Effects SDK 整个实现过程。
1、初始化 Effects SDK
初始化 Effects SDK 主要是完成对象的创建和资源的设置。
objective-c 代码实现如下:
...
// 设置资源
[ZegoEffects setModels:@[faceDetectionModelPath, segmentationModelPath]];
[ZegoEffects setResources:@[pendantBundlePath, whitenBundlePath]];
// 创建 effects 实例
ZegoEffects *effects = [ZegoEffects create:@license];
// 保存 effects 实例
self.effects = effects;
// 初始化effects 对象
[self.effects initEnv:CGSizeMake(width, height)];
java代码实现如下:
...
// 设置资源
ZegoEffects.setModels(aiModeInfos);
ZegoEffects.setResources(aiResources);
// 创建 effects 实例
ZegoEffects effects = ZegoEffects.create(license, getApplication());
// 初始化effects 对象
effects.initEnv(width, height);
2、初始化 Express SDK
初始化 Express SDK 主要完成视频帧数据格式的设置,启动自定义前处理功能以及注册回调对象。这里需要注意的是,不同平台下所用的视频帧格式有所不同。
平台 |
视频帧数据格式 |
iOS |
ZegoVideoBufferTypeCVPixelBuffer |
Android |
GL_TEXTURE_2D |
objective-c 代码实现如下:
// 创建 express 实例
[ZegoExpressEngine createEngineWithAppID:appID appSign:appSign isTestEnv:YES scenario:ZegoScenarioGeneral eventHandler:self];
// 选择 CVPixelBuffer 类型视频帧数据
ZegoCustomVideoProcessConfig *processConfig = [[ZegoCustomVideoProcessConfig alloc] init];
processConfig.bufferType = ZegoVideoBufferTypeCVPixelBuffer;
// 开启自定义前处理
[[ZegoExpressEngine sharedEngine] enableCustomVideoProcessing:YES config:processConfig channel:ZegoPublishChannelMain];
// 设置视频前处理回调对象
[[ZegoExpressEngine sharedEngine] setCustomVideoProcessHandler:self];
java 代码实现如下:
// 创建 express 实例
engine = ZegoExpressEngine.createEngine(appID, appSign, true, ZegoScenario.GENERAL, getApplication(), null);
// 选择 GL_TEXTURE_2D 类型视频帧数据
ZegoCustomVideoProcessConfig config = new ZegoCustomVideoProcessConfig();
config.bufferType = ZegoVideoBufferType.GL_TEXTURE_2D;
// 开启自定义前处理
engine.enableCustomVideoProcessing(true, config, ZegoPublishChannel.MAIN);
//设置视频前处理回调对象
engine.setCustomVideoProcessHandler(myHandler);
3、Express SDK + Effects SDK 的实现逻辑
Express SDK 提供的自定义视频前处理能与 Effects SDK 完美结合起来。自定义视频前处理功能无需开发者管理设备输入源,开发者只需在 Express SDK 提供的采集回调函数中对原始数据进行操作,再把数据传回给 Express SDK 即可。而 Effects SDK 在这个过程中负责对原始数据的处理。
objective-c 代码实现如下:
- (void)onCapturedUnprocessedCVPixelBuffer:(CVPixelBufferRef)buffer timestamp:(CMTime)timestamp channel:(ZegoPublishChannel)channel {
...
// 把Express SDK采集的数据传给Effects SDK进行处理
[self.effects processImageBuffer:buffer];
// 把Effects SDK处理后数据抛回给Express SDK
[[ZegoExpressEngine sharedEngine] sendCustomVideoProcessedCVPixelBuffer:output timestamp:timestamp channel:channel];
...
}
java 代码实现如下:
public void onCapturedUnprocessedTextureData(int textureID, int width, int height, long referenceTimeMillisecond, ZegoPublishChannel channel) {
ZegoEffectsVideoFrameParam param = new ZegoEffectsVideoFrameParam();
param.format = ZegoEffectsVideoFrameFormat.BGRA32;
param.width = width;
param.height = height;
// 把Express SDK采集的数据传给Effects SDK进行处理
int processedTextureID = effects.processTexture(textureID, param);
// 把Effects SDK处理后数据抛回给Express SDK
express.sendCustomVideoProcessedTextureData(processedTextureID, width, height, referenceTimeMillisecond);
}
4、AI视觉效果调整
Effects_SDK 还提供了美颜,美型,背景分割,人脸检测,挂件,滤镜等功能,广泛应用于娱乐直播,在线教育,拍照工具等多个场景,开发者可根据需要调用相应的接口。
objective-c 代码实现如下:
// 开启美白功能
[self.effects enableWhiten:YES];
// 设置美白强度,范围 [0, 100],默认为 50
ZegoEffectsWhitenParam *param = [[ZegoEffectsWhitenParam alloc] init];
param.intensity = 100;
[self.effects setWhitenParam:param];
java 代码实现如下:
// 开启美白功能
effects.enableWhiten(true);
// 设置美白强度,范围 [0, 100],默认为 50
ZegoEffectsWhitenParam param = new ZegoEffectsWhitenParam();
param.intensity = 100;
effects.setWhitenParam(param);
总结
以上就是关于在移动端通过使用 Express SDK 和 Effects_SDK 搭建音视频+Al 的解读。
ZEGO Effects 作为一款 AI 视觉产品,提供了多项智能图像渲染和算法能力,包括智能美颜、人像检测、图像分割等,被广泛应用于娱乐直播、在线教育、拍照工具等多种场景。
这是 AI 能力与音视频的有机结合,我们也期待在将来可以实现更多音视频与 AI 的创新应用。
ZEGO 教程 | RTC + AI 视觉的最佳实践(移动端)的更多相关文章
- EffectiveTensorflow:Tensorflow 教程和最佳实践
Tensorflow和其他数字计算库(如numpy)之间最明显的区别在于Tensorflow中的操作是符号. 这是一个强大的概念,允许Tensorflow进行所有类型的事情(例如自动区分),这些命令式 ...
- 听说你还不会用Dagger2?Dagger2 For Android最佳实践教程
前言 Dagger2是现在非常火的一个依赖注入框架,目前由Google维护,在Github上面已经有12K star了.Dagger2的入门门槛其实是比较高的,据了解,目前有很多Android工程师对 ...
- 2018亚太CDN峰会开幕, 阿里云王海华解读云+端+AI的短视频最佳实践
4月11-12日,2018亚太CDN峰会在北京隆重召开,在11日下午的短视频论坛中,阿里云高级技术专家王海华进行了<短视频最佳实践:云+端+AI>的主题演讲,分享了短视频的生命周期关键点和 ...
- CSS 布局:40个教程、技巧、例子和最佳实践
前言: 布局是WEB开发一个重要的课题,进入XHTML/CSS后,使用TABLE布局的方式逐渐淡出,CSS布局以众多优点成为主流,本文将介绍40个基于CSS的web布局的资源和教程.文章的出处在htt ...
- 腾讯云AI应用产品总监王磊:AI 在传统产业的最佳实践
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 背景:5月23-24日,以"焕启"为主题的腾讯"云+未来"峰会在广州召开,广东省各级政府机构领导.海 ...
- Sentry 后端监控 - 最佳实践(官方教程)
系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...
- 教程 - 在 Vue3+Ts 中引入 CesiumJS 的最佳实践@2023
目录 1. 本篇适用范围与目的 1.1. 适用范围 1.2. 目的 2. 牛刀小试 - 先看到地球 2.1. 创建 Vue3 - TypeScript 工程并安装 cesium 2.2. 清理不必要的 ...
- Python自动化运维 技术与最佳实践PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书
点击获取提取码:7bl4 一.内容简介 <python自动化运维:技术与最佳实践>一书在中国运维领域将有"划时代"的重要意义:一方面,这是国内第一本从纵.深和实践角度探 ...
- PHP 教程:Composer 最佳实践
概述 Composer 是 PHP 应用程序的依赖管理器,最初发布于大约 8 年前,2012 年 3 月. 在 php 中使用 Composer 可以提高代码的可重用性,并使你的项目能够轻松地集成来自 ...
- Kubernetes集群的监控报警策略最佳实践
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/79652064 本文为Kub ...
随机推荐
- MySQL 索引失效
全列匹配 最佳左前缀法则 不在索引列上做任何操作(计算.函数.自动.手动类型转换),会导致索引失效 存储引擎不能使用索引中范围条件右边的列 尽量使用覆盖索引(只访问索引的查询(索引和查询列一致)),少 ...
- 妙趣横生:利用Echarts实现SpreadJS引用从属关系的可视化魅力
最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 在金融行业,我们经常会有审计审查的需求,对某个计算结果进行审查,但是这个计算结果可能依赖多个单 ...
- 在Windows系统中解决端口占用问题
在Windows系统中,你可以通过以下步骤查询并结束占用8001端口的进程: 查询占用8001端口的进程: 打开命令提示符(CMD)或者PowerShell,并执行以下命令: netstat -a ...
- vb.net 实现excel导入的时候滚动显示导入的数据
如果你想在 Excel 导入过程中滚动显示导入的数据,可以使用逐行读取 Excel 数据并在滚动窗口中显示. 在 VB.NET 中,你可以使用 Excel.Range 对象逐行读取 Excel 数据, ...
- oeasy教您玩转vim - 9 - # 换行插入
插入新行 回忆上节课内容 上上次是 i.I 在光标前面插入 又加了 a.A 可以在光标后面插入 a 是在光标后插入 A 是在当前行最后插入 关于插入,还有什么命令吗? 我们继续去查阅 help :h ...
- [oeasy]python0013_ASCII码表_英文字符编码_键盘字符
ASCII 码表 回忆上次内容 ord(c)和chr(i) 这是俩函数 这俩函数是一对,相反相成的⚖️ ord 通过 字符 找到对应的 数字 chr 通 ...
- oeasy教您玩转python - 002 - # 你好世界 - 各位同学除夕快乐,除旧布新之时预祝能玩
你好世界 回忆上次内容 了解了 Python 安装了 Python 进入了 Python 退出了 Python 可是我们什么也没有做就离开了 IDLE 游乐场! 你好世界 #首先进入Python3 ...
- pytest批量执行多个测试文件(批量执行一个文件夹下的所有测试用例)
图片 代码 #!/usr/bin/env python # @File : test_runall.py import pytest import os # path = os.path.dirnam ...
- 涨见识了!脱离vue项目竟然也可以使用响应式API
前言 vue3的响应式API大家应该都特别熟悉,比如ref.watch.watchEffect等.平时大家都是在vue-cli或者vite创建的vue项目里面使用的这些响应式API,今天欧阳给大家带来 ...
- java进行文件搜索的一个小案例
分享一个小demo,可以查询某个文件目录下的某个文件并启动,来自黑马的IO教程 import java.io.File; import java.io.IOException; public clas ...